什么是Swift等效的respondsToSelector?

什么是Swift等效的respondsToSelector?

我用谷歌搜索,但无法找出快速等同于什么respondsToSelector:

这是我唯一能找到的东西(Swift替代respondsToSelector :)但在我的情况下并不太重要,因为它检查委托的存在,我没有委托我只想检查是否存在新的API或者不在设备上运行时,如果没有回到以前版本的api。


素胚勾勒不出你
浏览 1932回答 3
3回答

翻翻过去那场雪

更新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()}

LEATH

如上所述,在Swift中,大多数情况下,您可以使用?可选的unwrapper运算符实现所需的功能。这允许您在对象上调用方法,当且仅当对象存在(而不是nil)并且方法已实现时。在您仍然需要的情况下respondsToSelector:,它仍然作为NSObject协议的一部分。如果您respondsToSelector:在Swift 中调用Obj-C类型,那么它的工作方式与您期望的相同。如果您在自己的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"))   // truelet canEat = worker.respondsToSelector(Selector("eat:"))    // truelet canSleep = worker.respondsToSelector(Selector("sleep:minutes:"))    // truelet canQuit = worker.respondsToSelector(Selector("quit"))   // false重要的是不要遗漏参数名称。在这个例子中,Selector("sleep::")是不一样的Selector("sleep:minutes:")。

HUH函数

没有真正的Swift替代品。您可以通过以下方式办理登机手续:someObject.someMethod?()someMethod只有在对象上定义了方法,才会调用该方法,someObject但只能将其用于@objc已声明方法的协议optional。Swift本质上是一种安全的语言,所以每当你调用一个方法时,Swift必须知道方法就在那里。无法进行运行时检查。你不能只对随机对象调用随机方法。即使在Obj-C中你也应该尽可能避免使用这些东西,因为它与ARC不能很好地结合(ARC会触发警告performSelector:)。但是,在检查可用的API时respondsToSelector:,即使是Swift,如果要处理NSObject实例,仍然可以使用:@interface TestA : NSObject- (void)someMethod;@end@implementation TestA//this triggers a warning@endvar a = TestA()if a.respondsToSelector("someMethod") {    a.someMethod()}
打开App,查看更多内容
随时随地看视频慕课网APP