Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 检查可选的多参数委托方法_Ios_Swift_Objc Protocol - Fatal编程技术网

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

Ios 检查可选的多参数委托方法,ios,swift,objc-protocol,Ios,Swift,Objc Protocol,从新到迅速。如果(a)设置了委托并且(b)实现了方法,那么如何获得调用可选委托方法的最简洁/惯用语法呢 我知道?可以扮演这个角色(例如self.delegate.foo?()),但是当我试图调用一个具有多个参数并且还返回一个我关心捕获的值(Bool)的ObjC委托方法时,我很难正确使用语法(我想区分“未实现的方法”和“未实现的方法”)“方法实现并返回false”) 下面是一个示例。在本例中,MyDelegateProtocol有一个可选方法-myThing:argTwo:argThree:(返回

从新到迅速。如果(a)设置了委托并且(b)实现了方法,那么如何获得调用可选委托方法的最简洁/惯用语法呢

我知道
可以扮演这个角色(例如
self.delegate.foo?()
),但是当我试图调用一个具有多个参数并且还返回一个我关心捕获的值(Bool)的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
        }
    }
}

这段代码可以很好地与optionals配合使用,这就是您需要编写的全部内容

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?
(或任何可选的)键入。然后,您无法确定您的逻辑是否正确,您需要使用您在问题中执行的某种检查。但在大多数情况下,没有必要知道这种方法是否存在,如果存在,您只需调用它,如果不存在,则不调用,我的代码将处理它。

谢谢--我如何区分“不存在”和“被调用并返回false”?如果让展开,只需使用。它应该可以解决您的问题。或者您可以使用选项的
=
重载–
==true
表示已设置委托,已调用方法,并返回
true
==false
表示已设置委托,已调用方法,并返回
false
==nil
表示未实现该方法或未设置委托。您可以轻松地使用
switch
语句来区分每个案例。谢谢。为了绝对清楚,使用
if let result=delegate?.myThing?(…){/“result”是有效的}
不会在未设置委托或方法不存在时进入if块范围,如果它确实进入范围,则
result
将设置为调用它的返回值。对吧?我想承认这不仅对布尔来说是一样的,对任何类型的人来说也是一样的。如果方法返回可选类型,则此检查无法确保方法存在或委托不是nil(未设置)。