Вот решение, использующее общий тип шаблона:
public static <T> List<T> copyList(List<T> source) {
List<T> dest = new ArrayList<T>();
for (T item : source) { dest.add(item); }
return dest;
}
То, что вы пытаетесь сделать, абсолютно законно - вы действительно можете преобразовать строку в селектор, а затем передать этот селектор в пункт меню.
Однако вы пытаетесь использовать синтаксис буквенного выбора селектора для инициализации Selector
, давая этому языку построить Selector
в качестве аргумента (который просто синтаксически неверен), где на самом деле вы можете просто передать Selector
, возвращенный NSSelectorFromString
, на вызов инициализатора NSMenuItem.
Синтаксис буквенного синтаксиса #selector
используется, когда у вас есть «фиксированный» селектор, в котором вы хотите создать Selector
для (например, метод экземпляра класса, в котором вы находитесь). NSSelectorFromString
предназначен для таких случаев, как ваш, где селектор является переменной (теперь, когда в Swift 2.2 действительно имеется некоторый синтаксис, заданный для #selector
литералов!) [/ G2]
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)
}