[swift-users] Member wise initializer doesn't work with default-initialized const properties

Matthew Johnson matthew at anandabits.com
Tue May 17 13:03:50 CDT 2016



Sent from my iPad

> On May 17, 2016, at 11:42 AM, Jeremy Pereira via swift-users <swift-users at swift.org> wrote:
> 
> 
>> On 17 May 2016, at 15:48, Neil Faiman <neil at faiman.org> wrote:
>> 
>> On May 17, 2016, at 7:03 AM, Jeremy Pereira <jeremy.j.pereira at googlemail.com> wrote:
>> 
>>> 
>>>> On 16 May 2016, at 22:37, Neil Faiman via swift-users <swift-users at swift.org> wrote:
>>>> 
>>>> Using the default Swift with Xcode 7.3.1.
>>>> 
>>>> It appears that you cannot use the implicit memberwise initializer with a struct that has “let” properties with default values.
>>>> 
>>>> 
>>> 
>>> It’s not a default value, it is *the* value
>>> 
>>>> 
>>>> I don’t believe that the Apple _The Swift Programming Language_ mentions this restriction.
>>> 
>>> Chapter “The Basics”, section “Constants and Variables”
>>> 
>>> “The value of a constant cannot be changed once it is set”.
>> 
>> But:
>> 
>> “You can provide a default value for a stored property as part of its definition, as described in Default Property Values. You can also set and modify the initial value for a stored property during initialization. This is true even for constant stored properties, as described in Assigning Constant Properties During Initialization.” (Classes and Structures / Stored Properties)
> 
> 
> And did you try clicking through to “Assigning Constant Properties During Initialisation”? It says this:
> 
> “Once a constant property is assigned a value, it cannot be further modified”
> 
> I would argue that in 
> 
> struct A 
> {
>    let foo = 42
> }
> 
> foo has been assigned a value and cannot be further modified. The only way your interpretation can work is if the assignment in the declaration line is deemed to occur somehow before initialisation, which is a valid interpretation, but since 
> 
> struct A 
> {
>    let foo = 42
>    init(foo: Int)
>    {
>        self.foo = foo
>    }
> }
> 
> is an error, it looks like the compiler writers went with my interpretation. 
> 
> I certainly concede that it looks like the passage you found contradicts the two passages I found. Perhaps one of us should raise a bug to clarify the meaning and - if you are correct - fix the compiler.

This behavior was discussed quite extensively during in the threads and review of my memberwise init proposal.  It is likely to be revised in some way when memberwise init is revisited, perhaps in Swift 4.  You may wish to look up the feedback the core team gave at the conclusion of the review if you're interested in details.

> 
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users



More information about the swift-users mailing list