How are you going to deal with public properties creating a breaking change in 
the memberwise init()?

Example:

v1.0 of the API ships:

struct Person {
    let name: String
}

v1.1 of the API ships:

struct Person {
    let name: String
    let age: Int
}

When you use the implicit memberwise init(), the above change is now a breaking 
change. There are ways around it, but all seem fragile to me - for example, 
requiring a default value for new properties on the declaration site.

Similarly, the order of the members must remain the same now, changing them is 
a breaking change. This is ok for structs today because the generated init() is 
only available within a module so all of the places that use it are limited 
within your own codebase.

This is why I do not like like the implicit behavior and the @nomemberwise 
attribute on the declaration of the property; it tightly couples together 
things that are inherently fragile.

-David

> On Dec 22, 2015, at 8:46 AM, Matthew Johnson via swift-evolution 
> <[email protected]> wrote:
> 
> Hi Chris,
> 
> I have given your feedback a lot of thought and have taken another run at 
> this proposal from a slightly different angle.  I believe it is a significant 
> improvement.  
> 
> I believe the programmer model is now very clear straightforward:
> 
> The set of properties that receive memberwise initialization parameters is 
> determined by considering only the initializer declaration and the 
> declarations for all properties that are at least as visible as the 
> initializer (including any behaviors attached to the properties). The rules 
> are as follows:
> 
>       • Their access level is at least as visible as the memberwise 
> initializer.
>       • They do not have a behavior which prohibits memberwise initialization.
>       • The property is not annotated with the @nomemberwise attribute.
>       • The property is not included in the @nomemberwise attribute list 
> attached of the initializer. If super is included in the @nomemberwise
> 
> The parameters are synthesized in the parameter list in the location of the 
> ... placeholder. They are ordered as follows:
> 
>       • All properties without default values precede properties with default 
> values.
>       • Within each group, superclass properties precede subclass properties.
>       • Finally, follow declaration order
> 
> The new model has also dramatically simplified the implementation details.  
> No more need for the compiler to scan the initializer body!
> 
> There are still some details present that you provided feedback on.  My reply 
> from last night is still valid discussion around those issues.  Please reply 
> inline to that message if possible.  
> 
> I’m sure there are still plenty of details to discuss and work through, but I 
> hope you will agree that these changes are a step in the right direction.
> 
> https://github.com/anandabits/swift-evolution/blob/flexible-memberwise-initialization/proposals/NNNN-flexible-memberwise-initialization.md
>  
> <https://github.com/anandabits/swift-evolution/blob/flexible-memberwise-initialization/proposals/NNNN-flexible-memberwise-initialization.md>
> 
> Matthew

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to