为什么可以不实现 UIGestureRecognizerDelegate 协议的所有方法?

Why it's OK to not implement all methods of UIGestureRecognizerDelegate protocol?

在网上阅读资料时,我注意到定义视图控制器class以采用UIGestureRecognizerDelegate协议但只实现其中一种方法是很常见的:gestureRecognizer (gestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer)。例如,请参阅此 post ()。

我不知道为什么会这样。我认为应该实现协议的所有方法,对吗?我查看了 UIViewControl 文档,它没有提到 class 实现了这些方法。那么,是否这些方法是可选的,或者为协议定义了一个扩展以提供默认实现?我检查了 UIGestureRecognizerDelegate 协议文档,但没有任何指示。

如果您查看 one of the delegate methods 的声明,您会看到:

optional func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool

看到optional这个词了吗?这就是神奇之处。您也可以定义这样的方法。你只需要将你的协议和方法标记为 @Objc 因为 optional 是一个 Obj-C: thing:

@objc protocol P {
    @objc optional func f()
}

class C : P {}

f 就像 (() -> Void)?:

let p: P = C()
p.f?() // this is the same "?" operator as in "something?.somethingElse"
p.f!() // crashes
let a: (() -> Void)? = p.f // works
let b: () -> Void = p.f // error, p.f must be unwrapped