我在谷歌上搜索了一下,但没有找到与respondsToSelector:等价的swift:是什么。
这是我唯一能找到的(Swift替代respondsToSelector),但在我的情况下并不太相关,因为它检查委托的存在,我没有委托,我只是想检查在设备上运行时是否存在新的API,如果没有回落到API的以前版本。
我在谷歌上搜索了一下,但没有找到与respondsToSelector:等价的swift:是什么。
这是我唯一能找到的(Swift替代respondsToSelector),但在我的情况下并不太相关,因为它检查委托的存在,我没有委托,我只是想检查在设备上运行时是否存在新的API,如果没有回落到API的以前版本。
当前回答
swift..另一种可能的语法。
if let delegate = self.delegate, method = delegate.somemethod{
method()
}
其他回答
2017年3月20日更新Swift 3语法:
如果你不关心可选方法是否存在,只需调用delegate?.optionalMethod?()
否则,使用guard可能是最好的方法:
weak var delegate: SomeDelegateWithOptionals?
func someMethod() {
guard let method = delegate?.optionalMethod else {
// optional not implemented
alternativeMethod()
return
}
method()
}
最初的回答:
你可以使用“if let”方法来测试一个可选协议,就像这样:
weak var delegate: SomeDelegateWithOptionals?
func someMethod() {
if let delegate = delegate {
if let theMethod = delegate.theOptionalProtocolMethod? {
theMethod()
return
}
}
// Reaching here means the delegate doesn't exist or doesn't respond to the optional method
alternativeMethod()
}
当我开始将我的旧项目更新到Swift 3.2时,我只需要更改方法
respondsToSelector(selector)
to:
responds(to: selector)
如果你要测试的方法在@objc协议中被定义为可选方法(听起来像你的情况),那么使用可选的链接模式为:
if let result = object.method?(args) {
/* method exists, result assigned, use result */
}
else { ... }
当方法被声明为返回Void时,只需使用:
if object.method?(args) { ... }
See:
通过可选链接调用方法 摘自:苹果公司《快速编程语言》。 iBooks。https://itun.es/us/jEUH0.l
我猜你想为委托做一个默认实现。你可以这样做:
let defaultHandler = {}
(delegate?.method ?? defaultHandler)()
swift..另一种可能的语法。
if let delegate = self.delegate, method = delegate.somemethod{
method()
}