我可以使用数组中的字符串作为 Swift 中的选择器吗?

Can I use a string from an array as a selector in Swift?

我正在努力学习 Swift -- 当前的任务是从包含字符串的对象数组中为 Mac 应用制作一个简单的菜单。现在的问题是如何传递选择器,在数组中是字符串,在代码中是函数

class 是

 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 subMenu = 上)是:"argument of #selector cannot refer to a property"

这可行吗?这真的是可取的吗?有没有更好的方法?

提前致谢强调文本

您尝试做的是完全合法的 – 您确实可以将字符串转换为选择器,然后将该选择器传递给菜单项。

然而,您正在尝试使用选择器文字语法来初始化 Selector,为该语言构造一个 Selector 作为参数(这在语法上是错误的),实际上您可以只将 NSSelectorFromString 返回的 Selector 传递给 NSMenuItem 初始化程序调用。

选择器字面量语法 #selector 用于当您有一个 "fixed" 选择器并想为其创建一个 Selector 时(例如 class 你在)。 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)
}