4

对 Swift 来说很陌生。如果(a)设置了委托并且(b)实现了该方法,那么如何获得调用可选委托方法的最简洁/惯用的语法。

我知道?可以扮演这个角色(例如self.delegate.foo?()),但是当我尝试调用具有多个参数的 ObjC 委托方法并返回一个我关心捕获的值(Bool)时,我很难获得正确的语法(我想区分“方法未实现”和“方法已实现并返回 false”)。

这是一个例子。在这种情况下,MyDelegateProtocol有一个可选方法-myThing:argTwo:argThree:(返回 Bool)。

这个片段似乎得到了正确的语义,但它使用respondsToSelector并且非常健谈。它可以以更惯用的方式改进吗?

if let delegate = self.delegate {
    if delegate.respondsToSelector(#selector(MyDelegateProtocol.myThing(_:argTwo:argThree:))) {
        if delegate.myThing!(self, argTwo: foo, argThree: bar) {
            // do something
        }
    }
}
4

1 回答 1

5

此代码应该可以与选项一起正常工作。这就是你需要写的全部内容。

delegate?.myThing?(self, argTwo: foo, argThree: bar)

此代码应处理您尝试检查的所有情况,例如:

if let result = delegate?.myThing?(self, argTwo: foo, argThree: bar) {
     // "result" is the Bool returned from the method
}

如果它进入,则意味着您的方法存在并且委托已设置。唯一可能出现的问题是您的方法是否返回可选Bool?(或任何可选)类型。比您无法确定您的逻辑是否正确,并且您需要使用您在问题中执行的某种检查。仍然在大多数情况下,没有必要知道这种方法是否存在,如果存在则调用它,如果不存在则不调用,我的代码会处理它。

于 2016-08-27T19:17:52.790 回答