我在谷歌上搜索了一下,但没有找到与respondsToSelector:等价的swift:是什么。

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


当前回答

目前(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。

其他回答

当我开始将我的旧项目更新到Swift 3.2时,我只需要更改方法

respondsToSelector(selector)

to:

responds(to: selector)

对于swift 3.0

import UIKit

@objc protocol ADelegate : NSObjectProtocol {

    @objc optional func hi1()
    @objc optional func hi2(message1:String, message2:String)
}

class SomeObject : NSObject {

    weak var delegate:ADelegate?

    func run() {

        // single method
        if let methodHi1 = delegate?.hi1 {
            methodHi1()
        } else {
            print("fail h1")
        }

        // multiple parameters
        if let methodHi2 = delegate?.hi2 {
            methodHi2("superman", "batman")
        } else {
            print("fail h2")
        }
    }
}

class ViewController: UIViewController, ADelegate {

    let someObject = SomeObject()

    override func viewDidLoad() {
        super.viewDidLoad()

        someObject.delegate = self
        someObject.run()
    }

    // MARK: ADelegate
    func hi1() {

        print("Hi")
    }

    func hi2(message1: String, message2: String) {

        print("Hi \(message1) \(message2)")
    }
}

如果你要测试的方法在@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)()

等价的是?接线员:

var value: NSNumber? = myQuestionableObject?.importantMethod()

importantMethod只在myQuestionableObject存在并实现它时才会被调用。