我在谷歌上搜索了一下,但没有找到与respondsToSelector:等价的swift:是什么。
这是我唯一能找到的(Swift替代respondsToSelector),但在我的情况下并不太相关,因为它检查委托的存在,我没有委托,我只是想检查在设备上运行时是否存在新的API,如果没有回落到API的以前版本。
我在谷歌上搜索了一下,但没有找到与respondsToSelector:等价的swift:是什么。
这是我唯一能找到的(Swift替代respondsToSelector),但在我的情况下并不太相关,因为它检查委托的存在,我没有委托,我只是想检查在设备上运行时是否存在新的API,如果没有回落到API的以前版本。
当前回答
我猜你想为委托做一个默认实现。你可以这样做:
let defaultHandler = {}
(delegate?.method ?? defaultHandler)()
其他回答
斯威夫特3:
协议
@objc protocol SomeDelegate {
@objc optional func method()
}
对象
class SomeObject : NSObject {
weak var delegate:SomeObject?
func delegateMethod() {
if let delegateMethod = delegate?.method{
delegateMethod()
}else {
//Failed
}
}
}
如前所述,在Swift中,大多数情况下您可以通过?可选的解包装操作符。这允许你当且仅当对象存在(不是nil)并且方法被实现时调用该对象的方法。
在你仍然需要respondsToSelector:的情况下,它仍然作为NSObject协议的一部分存在。
如果你在Swift的Obj-C类型上调用respondsToSelector:,那么它的工作原理与你所期望的一样。如果你在你自己的Swift类上使用它,你需要确保你的类派生自NSObject。
下面是一个Swift类的例子,你可以检查它是否响应选择器:
class Worker : NSObject
{
func work() { }
func eat(food: AnyObject) { }
func sleep(hours: Int, minutes: Int) { }
}
let worker = Worker()
let canWork = worker.respondsToSelector(Selector("work")) // true
let canEat = worker.respondsToSelector(Selector("eat:")) // true
let canSleep = worker.respondsToSelector(Selector("sleep:minutes:")) // true
let canQuit = worker.respondsToSelector(Selector("quit")) // false
重要的是不要遗漏参数名。在本例中,Selector("sleep::")与Selector("sleep:minutes:")不同。
我猜你想为委托做一个默认实现。你可以这样做:
let defaultHandler = {}
(delegate?.method ?? defaultHandler)()
我只是在一个项目中实现了这一点,见下面的代码。正如@Christopher Pickslay提到的,重要的是要记住函数是第一类公民,因此可以像可选变量一样对待。
@objc protocol ContactDetailsDelegate: class {
optional func deleteContact(contact: Contact) -> NSError?
}
...
weak var delegate:ContactDetailsDelegate!
if let deleteContact = delegate.deleteContact {
deleteContact(contact)
}
目前(Swift 2.1)你可以用3种方式检查它:
使用respondsToSelector由@Erik_at_Digit回答 使用的?@Sulthan回答道 用as?接线员: if let delegateMe = self.delegate as?YourCustomViewController { delegateMe.onSuccess () }
基本上,这取决于你想要达到的目标:
例如,如果你的应用程序逻辑需要执行一些操作,委托没有设置或指向委托没有实现onSuccess()方法(协议方法),那么选项1和3是最好的选择,尽管我会使用选项3,这是Swift的方式。 如果你不想在委派为nil或方法没有实现时做任何事情,那么使用选项2。