Тип ожидаемого типа аргумента [Swift] [дубликат]

Вот решение, использующее общий тип шаблона:

public static <T> List<T> copyList(List<T> source) {
    List<T> dest = new ArrayList<T>();
    for (T item : source) { dest.add(item); }
    return dest;
}
2
задан user1976727 3 May 2016 в 21:33
поделиться

1 ответ

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

Однако вы пытаетесь использовать синтаксис буквенного выбора селектора для инициализации 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)
}
0
ответ дан mz2 19 August 2018 в 05:12
поделиться
  • 1
    Замечательно! Спасибо за четкое объяснение! – user1976727 4 May 2016 в 06:33
Другие вопросы по тегам:

Похожие вопросы: