Ah, the irony…

Having argued against too much complexity, I now encountered an error in my 
software that shows why there might indeed be a need for “open” and “public”.

In an API:

class Foo {
  open func foo(options: Option ...) {
    foo(options)
  }
  open func foo(options: [Options]) { … }
}

An API user might do this:

class Bar: Foo {
  override func foo(options: Option ...) {
    …
    super.foo(options)
  }
}

var b = Bar()
b.foo(options: [Option.thisOne])

This compiles fine, and will even work .... up to a point where the additions 
in Bar.foo are essential. Then it fails.
The user should have called:  b.foo(options: Option.thisOne)

This can easily be prevented by making Foo.foo(options: Option) public instead 
of open.
Then the user would not have been able to override the convenience method.
Furthermore: the user would not have experienced any inconvenience either as 
Foo.foo() would still be usable.

The interesting thing is that in this case there is no real argument on the 
side of the API developer to have a need for either open or public. It is 
entirely to the benefit of the API user. To me that makes a case for having 
both open and public. As an API developer I am willing to “go the extra mile” 
to create a good user experience, even if that means using tricks to achieve 
that end. However that would be impossible in this case. This end-user 
convenience is only achievable through open and public.

Regards,
Rien

Site: http://balancingrock.nl
Blog: http://swiftrien.blogspot.com
Github: http://github.com/Balancingrock
Project: http://swiftfire.nl



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

Reply via email to