繁体   English   中英

嵌套的Swift词典

[英]Nested Swift Dictionaries

我想用嵌套在里面的字典初始化一个字典,如下所示:

var a = [Int:[Int:Float]]()
a[1][2] = 12

但是我收到一个错误:

(Int:[Int:Float]) does not have a member named 'subscript'

我已经攻击了其他各种方法,所有这些方法都遇到了某种问题。

知道为什么这不起作用吗?

它给你这个错误,因为你的第一个下标返回一个可选的,所以它可能返回一个字典或零。 在它返回nil的情况下,第二个下标将是无效的。 您可以强制它使用散列点解包可选值。

var a = [1 : [ 2: 3.14]]
a[1]
a[1]![2]

如果你不肯定[1]是非零的,你可能想要用问号安全地解开。

var a = [1 : [ 2: 3.14]]
a[1]
a[1]?[2]

您也可以使用此方法进行分配。 (截至Beta 5)

var a = [Int:[Int:Float]]()
a[1] = [Int: Float]()
a[1]?[2] = 12.0
a[1]?[2] //12.0

您可以像这样创建自己的2D字典:

struct Dict2D<X:Hashable,Y:Hashable,V> {
    var values = [X:[Y:V]]()
    subscript (x:X, y:Y)->V? {
        get { return values[x]?[y] }
        set {
            if values[x] == nil {
                values[x] = [Y:V]()
            }
            values[x]![y] = newValue
        }
    }
}
var a = Dict2D<Int,Int,Float>()
a[1,2] = 12
println(a[1,2]) // Optional(12.0)
println(a[0,2]) // nil

重点是通过a[x,y]而不是a[x][y]a[x]?[y]访问元素。

另一种方法是使用标准字典的扩展:

extension Dictionary {
    mutating func updateValueForKey(key: Key, updater: ((previousValue: Value?) -> Value)) {
        let previousValue = self[key]
        self[key] = updater(previousValue: previousValue)
    }
}

例:

var a = [Int:[Int:Float]]()
a.updateValueForKey(1) { nestedDict in
    var nestedDict = nestedDict ?? [Int:Float]()
    nestedDict[2] = 12
    return nestedDict
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM