为单个键添加多个定义

时间:2017-01-15 10:40:16

标签: swift

好的,我说我有一本字典:

var someDict = [String: String]()

我可以使用以下命令添加键和定义:

someDict["Smiling"] = ":)

但是,我要说我想向"Smiling"添加另一个定义,例如:D

someDict["Smiling"]? += ":D"

print(someDict)
["Smiling": ":):D"]

现在我想要的是

["Smiling": ":)", ":D"]。我知道这不会起作用,因为,分隔符。

所以我需要一种方法来使用["Smiling": [":)", ":D"]],这样我就可以使用someDict["Smiling"][1]访问它,并且等于:D

我不想列出我想尝试过的事情,因为这一切都没用,我也不知道自己在做什么。

总结一下,

我希望能够在字典中添加一个键,可能在for循环中。

2 个答案:

答案 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