我想用嵌套在里面的字典初始化字典,如下所示:
var a = [Int:[Int:Float]]()
a[1][2] = 12
但是我收到了一个错误:
(Int:[Int:Float]) does not have a member named 'subscript'
我已经攻击了其他各种方法,所有这些方法都遇到了某种问题。
知道为什么这不起作用?
答案 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]
访问该元素。