<div dir="ltr"><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">Hello,</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">I hope this is the appropriate place to raise this discussion and see if it's worth a proposal around which direction to take.</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">I've recently had some confusion around specifying weak for a property in a protocol and surprised later of not being warned if the adopting type does not also specify weak for the property. There is an open bug around this behaviour [SR-479](<a href="https://bugs.swift.org/browse/SR-479">https://bugs.swift.org/browse/SR-479</a>). Example:</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">class A {}</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">protocol P {</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)"> weak var weakVar: A? { get set }</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">}</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">class B: P {</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)"> var weakVar: A? // Not declared weak, no compiler warning/error</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">}</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">Jordan Rose left the comment, "We need to figure out what weak means in a protocol. We should probably ban it for now."</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">It is a little inconsistent to allow an ownership attribute in a protocol but not enforce the same attribute in the adopting type I think. I guess the point could be made that it's to document/hint that the type adopting the protocol should use the ownership attribute suggested? The Swift Programming Language reference has this to say about Property Requirements in Protocols:</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">“A protocol can require any conforming type to provide an instance property or type property with a particular name and type. The protocol doesn’t specify whether the property should be a stored property or a computed property—it only specifies the required property name and type.”</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">There’s no mention if the protocol can specify weak/unowned for a property.</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">My concern is that this is a warning when this situation happens in Objective-C and there's another bug that makes this point [SR-1494](<a href="https://bugs.swift.org/browse/SR-1494">https://bugs.swift.org/browse/SR-1494</a>).</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">Would that be desirable behaviour to warn/error in Swift in the adopting type? Or does it make more sense as Jordan commented on the original bug to ban it in protocols (technically a source breaking change)?</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">I've done some initial investigation on how difficult it would be to [implement banning it in protocols](<a href="https://github.com/gspiers/swift/commit/ecde3ec5f61f259f8a396618e9973bac04536fd0">https://github.com/gspiers/swift/commit/ecde3ec5f61f259f8a396618e9973bac04536fd0</a>). This would be my first contribution so sorry the code will need some work but I'm happy to try and get it in shape and work on a proposal if people think it's worth fixing.</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">Thanks,</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69);min-height:14px"><br></p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">
</p><p style="margin:0px;font-size:12px;line-height:normal;font-family:'helvetica neue';color:rgb(69,69,69)">Greg Spiers</p><div><br></div></div>