使用swift字典会返回其所有值吗?

时间:2017-07-15 13:50:50

标签: swift dictionary

我有快速字典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",这意味着两个功能都运行了。

1 个答案:

答案 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的强引用。

在实际应用中,您应该:

  • 制作foo1foo2顶级功能

  • 写下这样的内容:

    var myD: [myEnum : ()->Void] {
        return [
            .one : {[weak self] in self?.foo1()},
            .two : {[weak self] in self?.foo2()},
        ]
    }