扩展已经符合某些协议的 swift 类

问题描述 投票:0回答:1

我有一些符合第三方库协议

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
继承的视图。这导致为每个继承的类复制并粘贴一个逻辑。我不想重复自己:)

ios swift inheritance swift-protocols
1个回答
0
投票

如果您的基础

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 { }
© www.soinside.com 2019 - 2024. All rights reserved.