[英]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.