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

Jeremy Pereira jeremy.j.pereira at googlemail.com
Tue May 17 11:42:20 CDT 2016


> 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.



More information about the swift-users mailing list