2016-05-03 18 views
2

私はSwiftを学習しようとしています - 現在のタスクは、文字列を含むオブジェクトの配列からMacアプリケーションのための簡単なメニューを作っています。問題は今セレクタを渡す方法です。セレクタは配列内では文字列ですが、コード内では関数です。配列の文字列をSwiftのセレクタとして使用できますか?

クラスは

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

(LETサブメニュー上=)エラーメッセージがあるされている: "#selectorの引数は、プロパティを参照することはできません"

これは可能ですか?これは実際に行うのが望ましいのでしょうか?より良い方法がありますか?事前

おかげで何をしようとするテキスト

+0

のような例この種のために意図され、このSOポストチェックアウトします。http: //stackoverflow.com/questions/30286143/swift-call-class-function-or-property-by-string – penatheboss

答えて

0

を強調し、完全に合法的である - あなたは確かに、メニュー項目にそのセレクタを渡し、セレクタに文字列を変換することができます。

あなたはしかし、実際にはあなただけにNSSelectorFromStringによって返さSelectorを渡すことができる場所、その言語は(単に文法的に間違っている)の引数としてSelectorを構築与え、Selectorを初期化するために、セレクタリテラル構文を使用しようとしています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

関連する問題