我有一个非常一般的视图,由多个视图控制器创建和使用,有2个按钮,其中一个有时会根据需要隐藏。 该视图代表两个按钮的点击。
protocol TheViewsDelegate: class {
func button1Tapped()
func button2Tapped()
}
让我们看看ViewControllerA创建了这个视图并需要两个按钮,这个视图控制器必须实现两个委托函数并在其中做一些事情。
现在让我们假设ViewControllerB创建相同的视图,但只需要其中一个按钮。该视图控制器必须仍然实现button2Tapped()
,即使它永远不会被调用和使用。
有没有办法很好地处理这个问题?我想有一个很好的解决方案,如果我不需要它,我不需要实现这个button2Tapped()
。
我考虑通过提供默认实现使其成为可选项,但我不喜欢这个解决方案,我喜欢(我认为这是一个很好的做法)编译器在没有实现的方法时给我一个错误。有人可以跳进项目而没有意识到他/她在需要实现时没有实现button2Tapped。
注意:这是一个非常简单的例子,只是为了说明我的问题,但问题更广泛,如当委托中的函数由控制器定义时不需要做什么实施它。
答案 0 :(得分:0)
我相信你想用:
可选功能
答案 1 :(得分:0)
有几种方法可以将协议方法声明为可选方法,一种方法是使用optional func
,这需要使用@objc
语法,许多程序员显然不喜欢这种语法,并且其他需要在协议扩展中声明一个空体(默认情况下使其成为可选)。
protocol TheViewsDelegate: AnyObject {
func button1Tapped()
}
extension TheViewsDelegate {
func button2Tapped() {}
}
class SomeViewController: UIViewController, TheViewsDelegate {
func button1Tapped() {
// implement
}
}
通过在协议扩展中为协议提供一个空主体,该方法是可选的,不需要通过符合对象来实现。
作为比较,替代方案:
@objc protocol TheViewsDelegate: AnyObject {
func button1Tapped()
@objc optional func button2Tapped()
}
class SomeViewController: UIViewController, TheViewsDelegate {
func button1Tapped() {
// implement
}
}