创建空字典

时间:2016-12-28 12:12:22

标签: swift

我有一个字典初始化

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'"
        }
    } 
} 

我该如何解决这个问题?被困在这里几个小时。

3 个答案:

答案 0 :(得分:3)

使用密钥订阅Dictionary会返回Value?类型的可选项。在您的情况下,dictionary["Hello"]会返回[Double]?。此可选项模拟了字典不包含给定键值的可能性。

如果您只处理静态数据,最好只使用文字表达式:

let dictionary = [
    "Hello": [0.0]
]

如果您正在使用动态数据,那么有几种方法可以执行您尝试实现的目标,具体取决于您希望如何处理nil案例:

  1. 使用可选链接

    dictionary["Hello"]?.append(0.0)
    
    • 这会附加到为密钥"Hello"存储的数组中,但如果该密钥没有此类值,则不会执行任何操作。
    • 这有使得bug更难捕获的缺点,因为在代码的这部分运行很久之后,可能无法观察到无声nil情况的后果。
  2. 使用强制展开

    dictionary["Hello"]!.append(0.0)
    
    • 这会附加到为密钥"Hello"存储的数组中,但如果该密钥没有该密钥的值,则会崩溃该程序。
    • 与可选链接不同,这使得在运行时轻松捕获故障点。当然,它带来了崩溃程序的缺点。
  3. 以自己的方式处理零案件

    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>

??

此方法确实会创建一个新数组,而不是改变现有数组。