检查可选的多参数委托方法

Ben*_*tto 4 ios objc-protocol swift

对斯威夫特来说很新.如果(a)设置委托并且(b)实现该方法,那么如何获得调用可选委托方法的最简洁/惯用语法则苦苦挣扎.

我知道?可以扮演这个角色(例如self.delegate.foo?()),但我越来越陷入困境时试图调用具有多个参数的ObjC委托方法,并返回我关心捕获值(布尔)语法正确的(我想区分"方法未实现"和"方法已实现并返回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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Vol*_*myr 5

此代码应该适用于选项.这就是你需要写的全部内容.

delegate?.myThing?(self, argTwo: foo, argThree: bar)
Run Code Online (Sandbox Code Playgroud)

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

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

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