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

时间:2016-05-03 21:33:56

标签: arrays swift selector

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

班级

 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 =上)是:“#selector的参数不能引用属性”

这可行吗?实际上这是否可取?还有更好的方法吗?

提前致谢强调文字

1 个答案:

答案 0 :(得分:0)

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

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

当你有一个" fixed"时,会使用选择器文字语法#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)
}