I think a stop-gap solution is ok in the short term.

Longer term, it would be nice to have:
1) A way to mark a conformance as weak.  That is, it is only used if a non-weak 
conformance is unavailable.
2) A way to explicitly declare that a method/property satisfies a protocol’s 
method/property even if the names don’t match (as long as the shapes still do)

Xiaodi and I had a fairly length discussion about #2 on evolution back in phase 
1, and there was discussion of #1 back in the Swift 3 timeframe.  Both 
discussions fizzled out without consensus, as there were more exciting 
discussions happening at the same time.

It is probably out of scope for Swift 4, but I believe we will need to tackle 
some of these nuances around protocol conformances before we can stabilize.


> On Mar 23, 2017, at 11:42 AM, Jordan Rose via swift-dev <swift-dev@swift.org> 
> wrote:
> 
> Hi, everyone. I wanted to get some advice on an issue I've been worrying 
> about: the effect of added conformances on source compatibility. Let's take 
> my own (stale) PR as an example: #4568 
> <https://github.com/apple/swift/pull/4568> makes all CF types Equatable and 
> Hashable, using the functions CFHash and CFEqual. What happens if somebody's 
> already done that in their own extension of, say, CFBag 
> <https://developer.apple.com/reference/corefoundation/cfbag-s1l#//apple_ref/swift/cl/c:@T@CFBagRef>?
> 
> (Let's not debate in this thread whether this is a good idea. It's consistent 
> with NSObject, at least.)
> 
> Since conformances are globally unique today, I think the only valid 
> short-term answer is to say the user's conformance is invalid, and indeed 
> that's the behavior you would get today if you update to a newer version of a 
> package and discover that they've added a conformance.
> 
> The trouble is that this breaks Swift 3 source compatibility. Unlike many 
> other changes, conformances cannot be made conditional on the language 
> version. This isn't just because of syntax; someone may have a generic type 
> that relies on the conformance being present, and it would be an error to 
> construct that type without the conformance.
> 
> The solution I thought of was to downgrade the error to a warning, saying 
> "this conformance is invalid and will be ignored". This isn't ideal, but it 
> will probably do the right thing—how often is there a protocol you can add to 
> a type in multiple, significantly different ways?
> 
> Okay, great. Except this only solves half the problem: in order to implement 
> Hashable, I need to provide a 'hashValue' property. We normally don't treat 
> API additions as breaking changes because that would keep us from making any 
> changes, but protocol requirements are a little different—in those cases we 
> are clearly going to have naming conflicts. These, of course, are reported as 
> errors today, and it feels much stranger to downgrade those errors to 
> warnings. "Sorry, this code you have written is going to be ignored, but 
> we'll keep building anyway?" Seems very fishy.
> 
> Options (as I see them):
> - Downgrade redeclaration errors to warnings for both conformances and members
> - Downgrade conformance redeclaration errors to warnings, but leave member 
> redeclaration as an error
> - Just leave both of these as errors, and accept that this facet of source 
> compatibility is imperfect, and anyone who needs to continue compiling with 
> Swift 3.1 can add #if.
> 
> Thoughts, answers? Thanks,
> Jordan
> 
> P.S. All of this will come back in spades with library evolution 
> <http://jrose-apple.github.io/swift-library-evolution>, and in particular 
> there are open issues 
> <http://jrose-apple.github.io/swift-library-evolution/#open-issues> in the 
> document around this.
> 
> P.P.S. Thanks to Dave Abrahams and Huon Wilson for initial discussion on this.
> _______________________________________________
> swift-dev mailing list
> swift-dev@swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to