2015-11-04 45 views
-1

我移植一些的OBJ-C代碼,並試圖做的雨燕相當的靜態方法:performSelector與斯威夫特

SEL selector = NSSelectorFromString(value); 

BOOL isColorMethod = [[UIColor class] respondsToSelector:selector]; 

if(isColorMethod) { 

    UIColor *color = [[UIColor class] performSelector:selector]; 
} 

我做了一些研究和所有我能找到的帖子建議我創建方法名稱的字典與每個顏色對象的實例。這看起來很不必要,我從plist中拉出顏色名稱(例如redColor),因爲我構建了一個簡單的StyleManager,所以它們必須是Strings。

任何人都知道你如何在Swift 2中做到這一點?

編輯

看來我是在編寫Swift 1畢竟。這在1中不起作用。似乎我應該知道這一點。我只是要去鞭打自己。

回答

3

你這樣做正是因爲你知道了:

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() 
} 

新增截屏懷疑托馬斯的好處:

enter image description here

編輯 MartinR說,我哪裏有takeRetainedValue()你應該把takeUnretainedValue()。我不知道,所以我非常願意相信!

+0

我也試過這個,但它抱怨UIColor.performSelector ...讓我再看看... –

+0

沒有。不起作用。 'performSelector'不可用。 –

+0

There's performSelectorOnMainThread(selector :, withObject :)等,但我不明白你會如何使用這個靜態。 –