skip to Main Content

I have some class (class A: UIView) that conforms protocol UIGestureRecognizerDelegate from third-party library. I need to extend this class by adding some optional UIGestureRecognizerDelegate method, for example gestureRecognizer:shouldRequireFailureOfGestureRecognizer:. How to do that?

I have tried writing an extension for A:

extension A {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        print("abcd") // BREAKPOINT NOT REACHABLE
    }
}

Then an extension for a protocol (even without Self == A):

extension UIGestureRecognizer where Self == A {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        print("abcd") // BREAKPOINT NOT REACHABLE
    }
}

The only thing worked is subclassing A:

class B: A {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        print("abcd") // Hallelujah! BREAKPOINT IS reachable
    }
}

But I have multiple views that have to be inherited from A. And this leads to copy and paste one logic for each inherited class. I don’t want to repeat myself 🙂

2

Answers


  1. Chosen as BEST ANSWER

    After all efforts I found a satisfactory solution. So, in third-party library I had

    class A: UIGestureRecognizerDelegate { ... }
    

    And either class B: A and class C: A in that library. So I hane wrote

    extension A {
       func myHelperFunction(with some: Parameters) -> Bool {
          ...
       }
    }
    
    extension B {
       func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            myHelperFunction(with some: Parameters)
        }
    }
    
    extension C {
       func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            myHelperFunction(with some: Parameters)
        }
    }
    

    That's all. Minimum of code and self repeating.


  2. If your based A class is a subclass of NSObject, you just need to conform A to the UIGestureRecognizerDelegate once:

    class A: NSObject { // 👈 Should be subclass of `NSObject` or manually implement all requirements
      ... 
    }
    
    extension A: UIGestureRecognizerDelegate { ... }
    

    Now you can implement any of UIGestureRecognizerDelegate optional functions you like inside any extension of the A you need.


    Also, you can extend the protocol itself with a constraint of Self == A (only if A already conforms to UIGestureRecognizerDelegate ) like:

    extension UIGestureRecognizerDelegate where Self == A { }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search