我有一个字典初始化
var dictionary = [String: [Double]]()
我想附加
dictionary["Hello"].append(0.0)
但是这给了我错误“nil”。
我试图通过
来解决这个问题extension Dictionary {
func appendish(key: String, value: Double) {
if self[key] == nil {
this give me error "Ambiguous reference to member 'subscript'"
}
}
}
我该如何解决这个问题?被困在这里几个小时。
答案 0 :(得分:3)
使用密钥订阅Dictionary
会返回Value?
类型的可选项。在您的情况下,dictionary["Hello"]
会返回[Double]?
。此可选项模拟了字典不包含给定键值的可能性。
如果您只处理静态数据,最好只使用文字表达式:
let dictionary = [
"Hello": [0.0]
]
如果您正在使用动态数据,那么有几种方法可以执行您尝试实现的目标,具体取决于您希望如何处理nil
案例:
使用可选链接
dictionary["Hello"]?.append(0.0)
"Hello"
存储的数组中,但如果该密钥没有此类值,则不会执行任何操作。nil
情况的后果。使用强制展开
dictionary["Hello"]!.append(0.0)
"Hello"
存储的数组中,但如果该密钥没有该密钥的值,则会崩溃该程序。以自己的方式处理零案件
if var array = dictionary["Hello"] {
dictionary["Hello"] = nil // This line is a performance optimisation that removes the need for array to be copied
array.append(0.0)
dictionary["Hello"] = array
}
else {
print("No array for the key \"Hello\"") // Handle this as you wish
}
答案 1 :(得分:1)
有几种方法可以做到这一点。首先,这是错误的代码:
dictionary["Hello"].append(0.0)
可能没有与键相关联的数组" Hello",在这种情况下,nil
将由字典的下标返回。所以你需要打开它,无论是强迫还是非强制:
dictionary["Hello"]?.append(0.0)
// or
dictionary["Hello"]!.append(0.0)
但我认为你真正想做的是
if dictionary["Hello"] != nil {
dictionary["Hello"]!.append(0.0)
} else {
dictionary["Hello"] = [0.0]
}
经过很长一段时间摆弄扩展和东西(我不熟悉swift的这个区域),我终于编写了你想写的方法appendish
方法:
extension Dictionary where Value : RangeReplaceableCollection & ExpressibleByArrayLiteral, Value.Iterator.Element == Value.Element {
mutating func appendish(key: Key, value: Value.Element) {
if self[key] != nil {
self[key]!.append(value)
} else {
self[key] = [value]
}
}
}
// test
var dict = [String: [Double]]()
dict.appendish(key: "Hello", value: 0.0)
答案 2 :(得分:1)
字典查找会返回可选值,因为密钥可能不存在,在这种情况下它会返回self.swipeGest.isEnabled = false
。
如果您的目的是附加到数组(如果它存在)或创建一个尚未存在的数组,那么 nil coalescing operator nil
会派上用场:< / p>
??
此方法确实会创建一个新数组,而不是改变现有数组。