2015-05-11 24 views
5

我已經創建了一個用於Swift和Objective-C的預定義顏色庫,並且我已經爲Xcode重寫了一個插件,該插件在編輯器中預覽顏色以便它可以工作與我的圖書館(以及一些其他更改)。在Swift中動態調用方法

插件當前有一個創建的顏色列表。我對這個解決方案並不感到興奮,因爲它意味着我每次更改顏色列表時都必須在這裏修改我的代碼。另外我不喜歡有一個數據結構掛在約1500種顏色和字符串。似乎並不那麼高效或優雅。

我想要做的不是將所有顏色存儲在內存中,而是在代碼中遇到函數名稱時調用NSColor的正確函數。我發現我可以檢查NSColor是否響應具有函數respondsToSelector的選擇器:但調用performSelector:不符合我的需要,因爲我需要來自該調用的返回值。

那麼有沒有辦法從這個。

let colourDict [ String : NSColor ] = [ 
    "blackColor" : NSColor.blackColor(), 
    "whiteColor" : NSColor.whiteColor() ] 
... 

let foundColour = colourDict[ colourMethodName ] 

就像這樣。

if (NColor.respondsToSelector (Selector (colourMethodName)) { 
    foundColour = NSColor.performSelector (Selector (colourMethodName)) 
} 

顯然,這不會是performSelector:功能本身,而是我在尋找不同的是它會返回回NSColor對象類型的功能。

謝謝。

+0

我想你應該能[分配功能給一個變量,並調用它,當你需要回報值](http://stackoverflow.com/a/24521823/1445366)來完成你想要的。 (這使得這個問題的重複[在Swift中執行選擇器?](http://stackoverflow.com/questions/24158427/alternative-to-performselector-in-swift)) –

+1

這聽起來像你想重複['NSColorList']的功能(https://developer.apple。com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColorList_Class/index.html#// apple_ref/occ/cl/NSColorList)class ... – rickster

+1

您可以擁有一組方法,但實際上您不應該'不要拿着1500種顏色。 – Schemetrical

回答

0

由於您正在定義自己命名的色彩空間,因此您需要自行完成某些操作,因爲NSColor不包含許多預定義的色彩。我可以考慮兩種選擇:

您可以創建一個小型數據庫來保存顏色並將其作爲資源加載到項目中。按名稱查找RGBA值,然後根據該定義創建顏色。

使用打開名稱返回顏色的函數來擴展NSColor。那麼你並沒有把它們都留在記憶中。 (我的例子是使用的UIColor,但NSColor將工作太)

extension UIColor { 
    class func colorByName(name:String) -> UIColor { 
     switch name.lowercaseString { 
      case "blackcolor": 
       return UIColor.blackColor() 
      case "whitecolor": 
       return UIColor.whiteColor() 
      case "redcolor": 
       return UIColor.redColor() 
      // etc 
     default: 
      return UIColor.clearColor() 
     } 
    } 
} 


let color = UIColor.colorByName("redcolor") 

當然,如果你很聰明,你可以將二者結合起來,並使其所以顏色定義可以在運行時進行更新。

+0

我已經創建了庫並將它們放在GitHub上,它們是UIColor和NSColor的擴展,它們定義了大約1500個附加顏色,以便您可以編寫諸如'UIColor.africanVioletColor()'等代碼。這個插件是爲了向你展示Xcode中的一個小盒子的顏色(以及其他創建顏色的方式)。我只是想避免有一個龐大的數據結構和代碼來構建它。 – CanadianMacFan

+0

@CanadianMacFan什麼是URL? –

+0

該庫被稱爲[Rainbow UIColor Extension](https://github.com/NorthernRealities/Rainbow)。我很快就得到了NSColor的一個版本。如果你對可以在Xcode中查看和改變顏色的插件感興趣,你可以在這裏找到它(https://github.com/NorthernRealities/ColorSenseRainbow)。 – CanadianMacFan

0

我不明白Aaron Brager的原始建議有什麼問題。先從功能字典

let colourDict : [ String :() -> UIColor ] = [ 
    "blackColor" : UIColor.blackColor, 
    "whiteColor" : UIColor.whiteColor, 
    // ... and so on ... 
] 

這是非常高效的 - 遠遠超過生成所有的顏色在內存中並保持他們有更高效的 - 因爲它只是一個指針列表,基本上是這樣。

爲了獲得實際的顏色,獲得通過名稱顏色功能,並將其命名爲:

let actualColor = colourDict["blackColor"]!() 
+0

感謝您的示例和進一步解釋。如果我沒有找到更好的東西,我會繼續這樣做。問題是我有大約1500個項目要定義,因爲我的圖書館添加了許多新的顏色作爲擴展。另外,每次我對圖書館進行更改時,這都會成爲另一個我必須記住的地方。這就是爲什麼我希望找到類似於performSelector的解決方案。不是performSelector會工作,因爲它不返回任何東西,我需要返回一個NSColor對象。 – CanadianMacFan

+0

當然,我明白。如果你真的想要字符串到方法的調用轉換,堅持使用Objective-C並完成它。我只是在說明一種方法。 – matt