2016-05-03 1 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) 
     } 

сообщение об ошибке (на выпускаемую SubMenu =) является: "аргумент #selector не может относиться к свойству"

Действительно ли это? Желательно ли это на самом деле? Есть ли способ лучше?

Заранее спасибо выделенный текст

+0

Заканчивать этот SO сообщение: HTTP: //stackoverflow.com/questions/30286143/swift-call-class-function-or-property-by-string – penatheboss

ответ

0

То, что вы пытаетесь сделать, это полностью законно - вы действительно можете преобразовать строку в селекторе, а затем передать этот селектор в пункт меню.

Вы, однако пытаются использовать буквальный синтаксис селектора инициализацию Selector, давая что язык построить Selector в качестве аргумента (который только синтаксически неправильно), где на самом деле вы можете просто передать Selector возвращаемый NSSelectorFromString в вызов инициализатора NSMenuItem.

Синтаксис синтаксиса селектора #selector используется, если у вас есть «фиксированный» селектор в виду, что вы хотите создать Selector (например, метод экземпляра вашего класса). NSSelectorFromString предназначен для такого рода случаев, как у вас, где селектор является переменной (теперь, что в Swift 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