为什么可以不实现 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
在网上阅读资料时,我注意到定义视图控制器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