I like this idea, but I would imagine that for an extension with many functions
in it, requiring @nonobjc on each one would get tedious very fast. Could it be
required (or at least allowed in addition to per-method annotations) at the
extension level?:
@objc protocol P {}
@nonobjc extension P {
func foo() { }
func bar() { }
func baz() { }
func blah() { }
// etc...
}
I don’t know if this would have specific implementation ramifications over only
doing this on each method, if extensions cannot already be modified with
attributes. I can’t think of a case where I’ve seen annotations added to
protocol extensions, or any other extensions for that matter.
> On Jan 4, 2016, at 11:32 PM, Douglas Gregor via swift-evolution
> <[email protected]> wrote:
>
> Hi all,
>
> We currently have a bit of a surprise when one extends an @objc protocol:
>
> @objc protocol P { }
>
> extension P {
> func bar() { }
> }
>
> class C : NSObject { }
>
> let c = C()
> print(c.respondsToSelector("bar")) // prints "false"
>
> because the members of the extension are not exposed to the Objective-C
> runtime.
>
> There is no direct way to implement Objective-C entry points for protocol
> extensions. One would effectively have to install a category on every
> Objective-C root class [*] with the default implementation or somehow
> intercept all of the operations that might involve that selector.
>
> Alternately, and more simply, we could require @nonobjc on members of @objc
> protocol extensions, as an explicit indicator that the member is not exposed
> to Objective-C. It’ll eliminate surprise and, should we ever find both the
> mechanism and motivation to make default implementations of @objc protocol
> extension members work, we could easily remove the restriction at that time.
>
> - Doug
>
> [*] Assuming you can enumerate them, although NSObject and the hidden
> SwiftObject cover the 99%. Even so, that it’s correct either, because the
> root class itself might default such a method, and the category version would
> conflict with it, so...
>
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution