我有一些符合第三方库协议
class A: UIView
的类(UIGestureRecognizerDelegate
)。我需要通过添加一些可选的 UIGestureRecognizerDelegate
方法来扩展此类,例如 gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
。如何做到这一点?
我尝试为
A
编写扩展:
extension A {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
print("abcd") // BREAKPOINT NOT REACHABLE
}
}
然后是协议的扩展(即使没有
Self == A
):
extension UIGestureRecognizer where Self == A {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
print("abcd") // BREAKPOINT NOT REACHABLE
}
}
唯一有效的是子类化 A:
class B: A {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
print("abcd") // Hallelujah! BREAKPOINT IS reachable
}
}
但是我有多个必须从
A
继承的视图。这导致为每个继承的类复制并粘贴一个逻辑。我不想重复自己:)
如果您的基础
A
类是 NSObject
的子类,您只需使 A
符合 UIGestureRecognizerDelegate
一次:
class A: NSObject { // 👈 Should be subclass of `NSObject` or manually implement all requirements
...
}
extension A: UIGestureRecognizerDelegate { ... }
现在您可以在您需要的
UIGestureRecognizerDelegate
的任何扩展中实现您喜欢的任何 A
可选功能。
此外,您可以使用
Self == A
的约束来扩展协议本身(仅当 A
已经符合 UIGestureRecognizerDelegate
时),例如:
extension UIGestureRecognizerDelegate where Self == A { }