> On Jan 4, 2016, at 8:54 PM, Kevin Lundberg <ke...@klundberg.com> wrote:
> 
> 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.

We have some declaration modifiers (e.g., access-control modifiers) and 
attributes (e.g., availability) that distribute in this manner from the 
extension to its members. My only hesitation here is that @objc itself doesn’t 
distribute in this way, and I’d rather they not be inconsistent.

        - Doug

> 
>> On Jan 4, 2016, at 11:32 PM, Douglas Gregor via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> 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
>> swift-evolution@swift.org <mailto: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