我有快速字典myD
,其中包含myEnum
类型的枚举作为键,()
作为值。
当我尝试其中一个键的功能时,所有函数都被调用。请帮忙。这是以下代码:
class myScene: SKScene {
enum myEnum {
case one
case two
}
func foo1() { print(1) }
func foo2() { print(2) }
var myD: [myEnum : ()] {
return [
.one : foo1(),
.two : foo2()
]
}
func runFuncForCase(_ ca: myEnum) {
myD[ca]
}
override func didMove(to view: SKView) {
runFuncForCase(.one) //HERE!!!!!
}
}
当我运行应用程序时,我将.one
或.two
放入runFuncForCase(_:)
函数中,consle始终打印" 1"和" 2",这意味着两个功能都运行了。
答案 0 :(得分:7)
使用此词典声明,词典的值类型为Void
,其中只能包含空元组()
。
var myD: [myEnum : ()] {
return [
.one : foo1(),
.two : foo2()
]
}
foo1()
和foo2()
会在调用myD
的getter时进行评估。不是在myD
的下标之后。 (它们的返回类型为Void
,因此它们被视为返回空元组。)
你可能需要写这样的东西:
class myScene: SKScene {
enum myEnum {
case one
case two
}
func foo1() { print(1) }
func foo2() { print(2) }
var myD: [myEnum : ()->Void] { //### value type of the dictionary needs to be a function type
return [
.one : foo1, //### actual value of the dictionary needs to be a function itself,
.two : foo2, // not the result of calling the function
]
}
func runFuncForCase(_ ca: myEnum) {
myD[ca]!() //### To invoke the function, you need `()`
}
override func didMove(to view: SKView) {
runFuncForCase(.one)
}
}
需要注意的一些注意事项
上面的代码稍微简化一点,它忽略了创建保留周期的风险,因为实例方法隐含了self
的强引用。
在实际应用中,您应该:
foo1
和foo2
顶级功能或
写下这样的内容:
var myD: [myEnum : ()->Void] {
return [
.one : {[weak self] in self?.foo1()},
.two : {[weak self] in self?.foo2()},
]
}