Shall we revive this discussion?


-- 
Adrian Zubarev
Sent with Airmail

Am 25. August 2016 um 19:29:13, John McCall (rjmcc...@apple.com) schrieb:

On Aug 25, 2016, at 2:29 AM, Karl via swift-evolution 
<swift-evolution@swift.org> wrote:
This is not a new inconsistency. We’ve known about this since “open” was first 
proposed.

Having sealed protocols would be nice, but it’s too late for Swift 3 IMO.

Everything is too late for Swift 3.  Bug fixes are about to be too late for 
Swift 3, much less any actual language changes.

John.


Karl

On 22 Aug 2016, at 20:40, Adrian Zubarev via swift-evolution 
<swift-evolution@swift.org> wrote:

Hello dear Swift community,

I was updating some of my libraries where I noticed that the new open access 
modifier made the public modifier inconsistent in one way.

Conformances to protocols is logically the same as inheritances on classes. 

Conformances == (abstract) inheritance
That said we should allow protocols to be open/public like we now allow this 
distinction for classes.

open protocol from module A should mean that I’m allowed to conform to it in 
module B
public protocol will act as an interface in module B
Not only sounds this behavior like ‘nice to have’, it’s inconsistency and it’s 
a ‘really need’ + a source breaking change in general.

A common mistake in Swift 3.0 would be to hide protocol members behind public 
modifier for protocols that meant to be open. If a protocol member in an open 
class is disallowed to be overridden by the public modifier and this behavior 
is fixed, that will imply that you’ll have to open the member which you 
intended to be not overridable. 

// Before:

// In module A
public protocol Proto {
  func doSomething()
}

open class Base : Proto {
  // Dissallow to override - this would be a common mistake
  public func doSomething() {}
}

// Used in module B - so it should be `open` after all
class Test : Proto {
 func doSomething() {}
}

// After:
// In module A
open protocol Proto {
  func doSomething()
}

open class Base : Proto {
  // Whops we have to grant the ability to override this method now
  // I made a mistake designing my protocol in Swift 3.0 :/
  open func doSomething() {}
}

// In module B
class Test2 : Base {
  // Uuuuuuh I can do bad things with this now if the module A was not 
redesigned to fix this. :)))
  override func doSomething() {}
}
Personally I don’t have any feeling of how huge the impact might be on Swift if 
this behavior will be fixed. I also cannot tell if it’s something for Swift 3.x 
or Swift 4.0.




-- 
Adrian Zubarev
Sent with Airmail

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

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

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

Reply via email to