I found two workarounds. 1.
protocol Foo: class { func bar() } class Base:Foo { @objc func bar() { print("bar") } } class Baz: Base { override init() { super.init() let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(bar)) } } 2. protocol Foo: class { func bar() } extension Foo { func bar() { print("bar") } } class Baz: Foo { init() { let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(delegate)) } @objc func delegate() { bar() } } Zhao Xin On Sat, Jun 3, 2017 at 10:35 AM, Nate Birkholz via swift-users < swift-users@swift.org> wrote: > protocol Foo: class { > func bar() > } > > extension Foo { > func bar() { > print("bar") > } > } > > class Baz: Foo { > init() { > let tapRecognizer = UITapGestureRecognizer(target: self, action: > #selector(bar)) > } > } > > the #selector tells me: "Argument of '#selector' refers to instance method > 'bar()' that is not exposed to Objective-C" and asks me to add @objc to the > method definition. > > Adding @objc to the method tells me: "@objc can only be used with members > of classes, @objc protocols, and concrete extensions of classes" > > Adding @objc to the protocol doesn't fix it, just introduces new issues. > > "dynamic" cannot be applied to a protocol, so cannot be used > alternatively. > > Is there a way to get around this? If a method is called by a gesture > recognizer, is there no way to have a default protocol implementation? I'd > like to use default implementations if possible to make my code more DRY. > > Is there a roadmap/plan for swift-native selector dispatch? > > Thanks. I look forward to the inevitable reply revealing the dumb thing I > missed. :) > > -- > Nate Birkholz > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users > >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users