在Swift中,如何优化字典检查/分配?

时间:2015-12-20 09:24:21

标签: swift swift2

请参阅以下代码:

let myDict = [Int:Object]()

func task(newId: Int) {

    var newObj = myDict[newId]
    if (newObj == nil) {        // Question (1)
        newObj = Object()
        myDict[newId] = newObj

        newObj!.doSomething()   // Question (2)
    }
}

问题(1):我正在尝试查看与newId相关联的对象是否已在myDict中退出。如果没有,请创建一个并在myDict中分配。我想知道是否有更好的方法来做到这一点?它现在看起来不是很“迅速”:)

问题(2):我必须在这里添加!,但是我觉得有点奇怪,即使我刚刚在上面创建了一个新对象,我仍然需要强制解包它。 (Object中没有可用的初始化程序)

任何建议帮助我/纠正我更好地了解Swift表示赞赏。感谢。

2 个答案:

答案 0 :(得分:3)

var dict: Dictionary<Int,Int> = [1:1,2:2]
let o = dict[3] ?? Int(3)
// now do something with o, it goes from you dict, or it is the 'new' one
// finaly you can update you dict with 'new' o
dict[3] = o

来自apple docs

  

nil合并算子(a ?? b)打开一个可选的a if   包含一个值,如果a为nil,则返回默认值b。该   表达式a始终是可选类型。表达式b必须   匹配存储在。

中的类型

答案 1 :(得分:1)

我会这样写:

var myDict = [Int:Object]()

func task(newId: Int) {

    if myDict[newId] == nil {

        let newObj = Object()
        myDict[newId] = newObj

        newObj.doSomething()
    }
}
在此块中

编辑,您将获得非空newObj

if let newObj = myDict[newId] {
    newObj.doSomethingElse()
}