Ios 如何处理视图控制器中委托未使用的函数

Ios 如何处理视图控制器中委托未使用的函数,ios,swift,delegates,delegation,Ios,Swift,Delegates,Delegation,我有一个非常通用的视图,由多个视图控制器创建和使用,带有两个按钮,其中一个按钮有时会根据需要隐藏。 此视图代表轻触两个按钮 protocol TheViewsDelegate: class { func button1Tapped() func button2Tapped() } 让我们假设ViewControllerA创建了这个视图,并且需要两个按钮,这个视图控制器必须实现两个代理功能,并在其中执行一些操作 现在让我们假设ViewControllerB创建相同的视图,但

我有一个非常通用的视图,由多个视图控制器创建和使用,带有两个按钮,其中一个按钮有时会根据需要隐藏。 此视图代表轻触两个按钮

protocol TheViewsDelegate: class { 
     func button1Tapped()
     func button2Tapped()
}
让我们假设ViewControllerA创建了这个视图,并且需要两个按钮,这个视图控制器必须实现两个代理功能,并在其中执行一些操作

现在让我们假设ViewControllerB创建相同的视图,但只需要其中一个按钮。此视图控制器仍必须实现
button2Tapped()
,即使它永远不会被调用和使用

有没有办法处理好这件事?我想有一个很好的解决方案,如果我不需要,我不需要实现这个
button2Tapped()

我想通过提供一个默认的实现使它成为可选的,但我不喜欢这个解决方案,我喜欢(我认为这是一个很好的实践)编译器在方法未实现时给我一个错误。有些人可能会跳进项目,而没有意识到他/她没有在需要实施的时候实施


注意:这是一个非常简单的示例,仅用于说明我的问题,但问题更为广泛,例如当委托中的函数由不需要实现它的控制器定义时,该怎么办。

我相信您希望使用:


optional func

有两种方法可以将协议方法声明为可选的,一种是使用
optional func
,这需要使用
@objc
语法,这显然是许多程序员不喜欢的,另一种方法需要在协议扩展中声明一个空的主体(默认情况下是可选的)

通过在协议的扩展中为协议提供一个空主体,该方法是可选的,不需要通过一致性对象来实现

作为比较,备选方案:

@objc protocol TheViewsDelegate: AnyObject {
    func button1Tapped()
    @objc optional func button2Tapped()
}

class SomeViewController: UIViewController, TheViewsDelegate {
    func button1Tapped() {
        // implement
    }
}

然而,
optional
在UITableView(委托/数据源)中使用,例如:
optional func numberOfSections(在tableView:UITableView中)->Int
。现在,你能把这两种委托方法结合起来吗?像
func-button-tapped(_-button:UIButton)->Void
,如果用户可以访问按钮,或者使用
func-button-tapped(SomeIntegerActionEnumOrClosure)->Void
?@Larme苹果确实使用了
optional
,但我想这是否是一个好办法。在我看来,
optional
给代码带来了风险,其他开发人员可能不知道他们必须实现它,并且会默默地失败。在视图控制器中使用空方法“只是”丑陋,但在我看来更安全。因此,我将从您提供的
func buttonappedforAction(action:actionEnum)
的一小段信息开始。然后,开发人员可以决定是否要使用一个切换案例来管理所有操作?
@objc protocol TheViewsDelegate: AnyObject {
    func button1Tapped()
    @objc optional func button2Tapped()
}

class SomeViewController: UIViewController, TheViewsDelegate {
    func button1Tapped() {
        // implement
    }
}