为了账号安全,请及时绑定邮箱和手机立即绑定

什么是Swift等效的respondsToSelector?

什么是Swift等效的respondsToSelector?

素胚勾勒不出你 2019-08-26 15:07:32
什么是Swift等效的respondsToSelector?我用谷歌搜索,但无法找出快速等同于什么respondsToSelector:。这是我唯一能找到的东西(Swift替代respondsToSelector :)但在我的情况下并不太重要,因为它检查委托的存在,我没有委托我只想检查是否存在新的API或者不在设备上运行时,如果没有回到以前版本的api。
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

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


查看完整回答
1 反对 回复 2019-08-26
?
LEATH

TA贡献1936条经验 获得超6个赞

如上所述,在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"))   // 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:")。


查看完整回答
反对 回复 2019-08-26
?
HUH函数

TA贡献1836条经验 获得超4个赞

没有真正的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@end


var a = TestA()if a.respondsToSelector("someMethod") {
   a.someMethod()}


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 1919 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信