我可以使用数组中的字符串作为Swift中的选择器吗? [英] Can I use a string from an array as a selector in Swift?

查看:101
本文介绍了我可以使用数组中的字符串作为Swift中的选择器吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to learn Swift -- current task is making a simple menu for a Mac app from an array of objects that contain strings. The problem now is how to pass the selector, which in the array is a string, but in the code is a function.

班级是

 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的参数不能引用属性"

The error message (on let subMenu =) is: "argument of #selector cannot refer to a property"

这可行吗?实际需要这样做吗?有更好的方法吗?

Is this do-able? Is this desirable to actually do? Is there a better way?

预先感谢强调文字

推荐答案

您要尝试的工作完全合法-您确实可以将字符串转换为选择器,然后将该选择器传递给菜单项.

What you are trying to do is totally legit – you can indeed convert a string to a selector, then pass that selector to a menu item.

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

You're however trying to use the selector literal syntax to initialise a Selector, giving that language construct a Selector as an argument (which is just syntactically wrong), where in fact you can just pass the Selector returned by NSSelectorFromString to the NSMenuItem initialiser call.

选择器文字语法#selector用于当您要为其创建Selector(例如您所在类的实例方法)的固定"选择器时. NSSelectorFromString适用于像您这样的情况,其中选择器是一个变量(现在,在Swift 2.2中确实为#selector文字提供了一些语法!)

The selector literal syntax #selector is used when you have a "fixed" selector in mind that you want to create a Selector for (for instance an instance method of the class you are in). The NSSelectorFromString is intended for this kind of cases like yours where the selector is a variable (now that in Swift 2.2 there is indeed some syntax given for #selector literals!)

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)
}

这篇关于我可以使用数组中的字符串作为Swift中的选择器吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆