Swift 静态方法的 performSelector
performSelector for static methods with Swift
我正在移植一些 Obj-C 代码并尝试执行 Swift 等价于 :
SEL selector = NSSelectorFromString(value);
BOOL isColorMethod = [[UIColor class] respondsToSelector:selector];
if(isColorMethod) {
UIColor *color = [[UIColor class] performSelector:selector];
}
我做了一些研究,但我能找到的所有帖子都建议我创建一个包含每个颜色对象实例的方法名称字典。这似乎非常不必要,我正在从 plist 中提取颜色名称(例如 redColor),因为我正在构建一个简单的 StyleManager,因此它们必须是字符串。
有谁知道 Swift 2 是怎么做到的?
编辑
看来我毕竟是在创作 Swift 1。这在 1 中不起作用。看来我应该知道这一点。我只是要去鞭打自己。
你完全按照自己的方式去做:
let s = Selector("redColor")
let color = UIColor.performSelector(s)
唯一的问题是您必须添加内存管理。所以:
let s = Selector("redColor")
let color = UIColor.performSelector(s).takeRetainedValue()
加上您的 responds
检查:
let s = Selector("redColor")
if UIColor.respondsToSelector(s) {
let color = UIColor.performSelector(s).takeRetainedValue()
}
为多疑的托马斯添加了屏幕截图:
编辑 MartinR 说我有 takeRetainedValue()
的地方你应该放 takeUnretainedValue()
。我也不知道,所以我完全愿意相信!
我正在移植一些 Obj-C 代码并尝试执行 Swift 等价于 :
SEL selector = NSSelectorFromString(value);
BOOL isColorMethod = [[UIColor class] respondsToSelector:selector];
if(isColorMethod) {
UIColor *color = [[UIColor class] performSelector:selector];
}
我做了一些研究,但我能找到的所有帖子都建议我创建一个包含每个颜色对象实例的方法名称字典。这似乎非常不必要,我正在从 plist 中提取颜色名称(例如 redColor),因为我正在构建一个简单的 StyleManager,因此它们必须是字符串。
有谁知道 Swift 2 是怎么做到的?
编辑
看来我毕竟是在创作 Swift 1。这在 1 中不起作用。看来我应该知道这一点。我只是要去鞭打自己。
你完全按照自己的方式去做:
let s = Selector("redColor")
let color = UIColor.performSelector(s)
唯一的问题是您必须添加内存管理。所以:
let s = Selector("redColor")
let color = UIColor.performSelector(s).takeRetainedValue()
加上您的 responds
检查:
let s = Selector("redColor")
if UIColor.respondsToSelector(s) {
let color = UIColor.performSelector(s).takeRetainedValue()
}
为多疑的托马斯添加了屏幕截图:
编辑 MartinR 说我有 takeRetainedValue()
的地方你应该放 takeUnretainedValue()
。我也不知道,所以我完全愿意相信!