好的,我说我有一本字典:
var someDict = [String: String]()
我可以使用以下命令添加键和定义:
someDict["Smiling"] = ":)
但是,我要说我想向"Smiling"
添加另一个定义,例如:D
。
someDict["Smiling"]? += ":D"
print(someDict)
["Smiling": ":):D"]
现在我想要的是
["Smiling": ":)", ":D"]
。我知道这不会起作用,因为,
分隔符。
所以我需要一种方法来使用["Smiling": [":)", ":D"]]
,这样我就可以使用someDict["Smiling"][1]
访问它,并且等于:D
。
我不想列出我想尝试过的事情,因为这一切都没用,我也不知道自己在做什么。
总结一下,
我希望能够在字典中添加一个键,可能在for循环中。
答案 0 :(得分:1)
您需要的只是这种类型的数据格式:
var someDict = [String: [String]]()
初始化:
someDict["Smiling"] = [":)"]
这样你可以这样做:
someDict["Smiling"]?.append(":D")
并称之为:
someDict["Smiling"]?[1] //returns ":D"
修改强>:
值得一提的是,正如@dfri所说,使用显式数组索引调用(“[1]”)是不安全的,因为如果您的数组没有两个或更多值,这将失败。一个“Swifty”解决方案是通过检查它是否在数组中来验证无效索引。
这可能看起来像这样(感谢@Hamish代码):
let idx = 1
if let arr = someDict["Smiling"], arr.indices.contains(idx) {
print(arr[idx]) // :D
}
答案 1 :(得分:0)
你真的需要将它包装在你自己的结构中。具体如何做取决于你想要的语义,但考虑这样的事情作为起点:
struct MyDictArray {
private var _data: [String : [String]] = [:]
mutating func append(key: String, value: String) {
if let existingEntry = self._data[key] {
self._data[key] = existingEntry + [value]
} else {
self._data[key] = [value]
}
}
subscript(key: String) -> [String] {
get {
if let existingEntry = self._data[key] {
return existingEntry
} else {
return []
}
}
set {
if let existingEntry = self._data[key] {
self._data[key] = existingEntry + newValue
} else {
self._data[key] = newValue
}
}
}
subscript(key: String, index: Int) -> String? {
if index < self[key].count {
return self[key][index]
} else {
return nil
}
}
}
var someDict = MyDictArray()
someDict["Smiling"] = [":)"]
someDict.append(key: "Smiling", value: "D")
someDict["Smiling"]
someDict["Smiling", 1] // Safe indexing