2016-05-03 38 views
2

我想學習Swift - 目前的任務是從一個包含字符串的對象數組中爲Mac應用程序製作一個簡單的菜單。現在的問題是如何傳遞選擇器,它在數組中是一個字符串,但在代碼中是一個函數。我可以在數組中使用一個字符串作爲選擇器嗎?

類是

class menuArrayObject 
{ 
    var title: String = "" 
    var subMenuTitles: [String] = [] 
    var subMenuSelectors: [String] = [] 
} 

這是我的代碼

  for index2 in 0...counter2 - 1 
     { 
      let subMenuTitle = arrayObject.subMenuTitles[index2] 

      let subMenuSelector = NSSelectorFromString(arrayObject.subMenuSelectors[index2]) 


      let subMenu = NSMenuItem(title: subMenuTitle, action: #selector(subMenuSelector(_:)),keyEquivalent: "") 

      indexMenu.addItem(subMenu) 
     } 

錯誤消息(在讓子菜單=)是: 「#selector的參數可以不是指一個屬性」

這是可行的嗎?這實際上是可取的嗎?有沒有更好的辦法?

在此先感謝強調文本

+0

看看這個SO帖子:HTTP: //sackoverflow.com/questions/30286143/swift-call-class-function-or-property-by-string – penatheboss

回答

0

你所要做的是完全合法的 - 你可以字符串確實轉化爲一個選擇,那麼選擇傳遞給一個菜單項。

但是你試圖使用選擇文字語法初始化一個Selector,給這種語言構建Selector作爲參數(這只是語法錯誤),這裏其實你可以直接將返回Selector通過NSSelectorFromString到NSMenuItem初始化程序調用。

當您有一個「固定」選擇器時,使用選擇器文字語法#selector,因爲您想爲(例如您所在的類的實例方法)創建一個Selector。該NSSelectorFromString適用於這種像你這樣的情況下,其中的選擇是一個變量(現在的雨燕2.2有的確是#selector文字給予一定的語法!)

import Cocoa 

class MenuArrayObject 
{ 
    var title: String = "Foo" 
    var subMenuTitles: [String] = ["foo"] 
    var subMenuSelectors: [String] = ["foobar"] 
} 

let menuArrayObject = MenuArrayObject() 

let indexMenu = NSMenu() 

for (i, submenuTitle) in menuArrayObject.subMenuTitles.enumerate() { 
    let selectorStr = menuArrayObject.subMenuSelectors[i] 
    let selector = NSSelectorFromString(selectorStr) 
    let item = NSMenuItem(title: submenuTitle, action: selector, keyEquivalent: "") 

    indexMenu.addItem(item) 
} 
+0

太棒了!感謝您的明確解釋! – user1976727

相關問題