I am dealing with a variant of this on Android right now. I have just subclassed e.g. UITapGestureRecognizer to perform the 2nd variant above and externally accept a closure as its argument. I'm writing this on my phone so forgive any syntax errors or accidental omissions:
class TapGestureRecognizer: UITapGestureRecognizer { var onTap: (() -> Void)? init(onTap: (() -> Void)?) { self.onTap = onTap super.init(target: self, action: #selector(internalTapHandler)) } @objc private func internalTapHandler() { onTap?() } } class Baz: Foo { init() { let tapRecognizer = TapGestureRecognizer(onTap: self.bar) } } Cheers, Geordie On Sat 3. Jun 2017 at 16:53, Nate Birkholz via swift-users < swift-users@swift.org> wrote: > Thanks, the second had occurred to me, but felt a little too much like in > practice it would make the code harder to understand. > > On Fri, Jun 2, 2017 at 9:58 PM, Zhao Xin <owe...@gmail.com> wrote: > >> 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 >>> >>> >> > > > -- > 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