I briefly considered something like this but didn't explore it. Elegant. Sent from my iPhone, please excuse brevity and errors
> On Jun 3, 2017, at 9:38 PM, Geordie Jay <geo...@gmail.com> wrote: > > 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