Swift 如何传入字符串以调用子类中的动作

How to pass in a String to call an action form a Subclass in Swift

我创建了一个名为 SpriteKitButtonSKNode subclass,它创建了一个自定义 "button" 用于 SpriteKit,我在这里找到了它:

http://nathandemick.com/programming/tutorial/2014/09/23/buttons-sprite-kit-using-swift.html

效果很好,我设置了这样一个按钮:

var page4Button = SpriteKitButton(buttonUnpressedImage: "page4Unpressed.png", buttonPressedImage: "page4Pressed.png", buttonAction: page4)
    page4Button.position = CGPoint(x: 210, y: 210)
    page4Button.zPosition = 1.0
    self.addChild(page4Button)

它会正确调用我的 page4( ) 函数。所以我的问题是:如何修改我的 SpriteKitButton class 以通过发送 buttonAction 字符串 "page4:" 来初始化,而不是直接告诉它使用函数 page4?

我的目标是能够使用字符串插值来初始化 buttonAction,这样我就可以使用 for 循环制作按钮,而不是跨多行代码分别制作每个按钮。我以前从来没有 return 像这样从 subclass 中获取一些东西,我不确定从哪里开始。

感谢任何建议!

简短的回答是你不能。 Swift 不允许您将 String 转换为闭包。但是,您可以通过将函数数组中的每个元素作为按钮初始值设定项的 buttonAction 参数传递来循环创建所有按钮。

首先,定义并初始化一个 ()->Void 函数数组

let actions:[()->Void] = [page1,page2,page3]

然后,通过将每个数组元素作为 buttonAction 参数

传递,在循环中创建按钮
for i in 0..<actions.count {
    // Create your buttons here with actions[i] as the buttonAction argument

}

最后,定义您的 functions/methods

func page1() {
    println("page 1")
}

func page2() {
    println("page 2")
}

func page3() {
    println("page 3")
}