运行 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
如何启动知道其名称(作为字符串)的方法
// 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