运行 class 上的方法只知道它的名字

Run method on class knowing only its name

如何启动知道其名称(作为字符串)的方法

// key.rawValue.firstUppercased is `ApiAddress`
let result = preferencesRepository.perform(Selector("get\(key.rawValue.firstUppercased)"))

其中 preferencesRepository 具有方法 getApiAddress() 并符合 NSObject

public class RealPreferencesRepository: NSObject {
    func getApiAddress() -> String
// ...

我有致命错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[PreferencesModule.RealPreferencesRepository getApiAddress]:
unrecognized selector sent to instance 0x600000090a70'

提前感谢您的帮助

您需要在 getApiAddress() 方法前加上@objc 属性。

另外,由于perform方法的return值是Unmanaged的,需要使用takeRetainedValue()来转换return值

public class RealPreferencesRepository: NSObject {
    @objc func getApiAddress() -> String {
        return "success"
    }
}

let preferencesRepository = RealPreferencesRepository()

let result = preferencesRepository.perform(Selector("getApiAddress"))
let value = result?.takeRetainedValue() as! String
print(value)
// => success