gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:06:20 31 4
gpt4 key购买 nike

在 ObjC 中,您可以使用 NSObject 中的类方法简单地调用类方法。

[Machine performSelector:@selector(calculate:) withObject:num];

但是在 Swift 2.2 中如何做到这一点?

@objc(Machine) // put it here, so you can simply copy/paste into Playground
class Machine: NSObject {
static func calculate(param: NSNumber) -> String {
if param.integerValue > 5 {
return "42"
}
return "42" // there is only 1 answer to all the questions :D
}
}

if let aClass = NSClassFromString("Machine") {
let sel = #selector(Machine.calculate(_:))
let num = NSNumber(integer: 1337)
let answer = aClass.performSelector(sel, withObject: num) // compiler error
// let answer = aClass.calculate(num) // <-- this works
print(answer)
}

使用这段代码,我得到以下编译器错误:

error: cannot invoke 'performSelector' with an argument list of type '(Selector, withObject: NSNumber)'

我在这里错过了什么?

最佳答案

AnyClass 不符合开箱即用的 NSObjectProtocol。我必须将 aClass 转换为 NSObjectProtocol 才能使用 performSelector (performSelector:withObject: 作为方法桥接到 Swift在 NSObjectProtocol 上:

swift 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:

(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(),如果你想要转移内存所有权)是必需的。

关于ios - 如何在 Swift 中的 AnyClass 上使用 performSelector() 调用类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36208155/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com