嵌套的Swift词典

时间:2014-08-05 01:24:47

标签: swift

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

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

但是我收到了一个错误:

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

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

知道为什么这不起作用?

2 个答案:

答案 0 :(得分:4)

它会给你这个错误,因为你的第一个下标返回一个可选的,所以它可能会返回一个字典或nil。在它返回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

答案 1 :(得分:4)

您可以像这样创建自己的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]访问该元素。