且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在Swift的AnyClass上使用performSelector()调用类方法?

更新时间:2022-12-04 15:56:07

AnyClass不符合NSObjectProtocol的规定.我必须将aClass转换为NSObjectProtocol才能使用performSelector(performSelector:withObject:作为NSObjectProtocol上的方法桥接到Swift):

AnyClass does not conform to NSObjectProtocol out of the box. I had to cast aClass as NSObjectProtocol to use performSelector (performSelector:withObject: is bridged to Swift as a method on NSObjectProtocol):

迅速3:

if let aClass = NSClassFromString("Machine") {
    let sel = #selector(Machine.calculate(param:))
    let num = NSNumber(value: 1337)

    if let myClass = aClass as? NSObjectProtocol {
        if myClass.responds(to: sel) {
            let answer = myClass.perform(sel, with: num).takeRetainedValue() // this returns AnyObject, you may want to downcast to your desired type
            print(answer) // "42\n"
        }
    }
}

Swift 2.x:

Swift 2.x:

(aClass as! NSObjectProtocol).performSelector(sel, withObject: num) // Unmanaged<AnyObject>(_value: 42) 

更安全一点:

if let aClass = NSClassFromString("Machine") {
    let sel = #selector(Machine.calculate(_:))
    let num = NSNumber(integer: 1337)

    if let myClass = aClass as? NSObjectProtocol {
        if myClass.respondsToSelector(sel) {
            let answer = myClass.performSelector(sel, withObject: num).takeUnretainedValue()
            print(answer) // "42\n"
        }
    }
}

performSelector返回一个Unmanaged对象,这就是为什么需要takeUnretainedValue()(如果要转移内存所有权,也可以选择takeRetainedValue())的原因.

performSelector returns an Unmanaged object, that's why takeUnretainedValue() (or optionally takeRetainedValue() if you want to transfer memory ownership) are required.