将元素追加到字典中的现有键?

时间:2015-11-30 18:38:31

标签: swift

var iniArray = ["yikes", "bye"]

var wordDict: [Int: Array<String>]?

// initialize the wordDict
wordDict[0] = iniArray

现在让我们说我想在键0的值中添加另一个字符串元素。例如&#34; bike&#34;。所以它变成了:

wordDict[0] = ["yikes", "bye", "bike"]

我该怎么做?

3 个答案:

答案 0 :(得分:2)

首先,值得指出您的代码中存在两个问题:

  1. 在初始化之前尝试使用wordDict
  2. 尝试使用wordDict,就好像它不是可选的
  3. 因为您使wordDict成为可选项,所以在使用它之前必须始终确保它不是零。现在,在您的代码段中,wordDict为零。

    var iniArray = ["yikes", "bye"]
    var wordDict: [Int: Array<String>]?
    wordDict[0] = iniArray // error: value of optional type '[Int : Array<String>]?' not unwrapped; did you mean to use '!' or '?'?
    

    使用?

    可以解决后一个问题
    var iniArray = ["yikes", "bye"]
    var wordDict: [Int: Array<String>]?
    wordDict?[0] = iniArray
    wordDict?[0] = ["yikes", "bye", "bike"]
    

    但如果这是你做出的唯一改变,那么你可能会对这个价值感到惊讶:

    print(wordDict) // prints "nil"
    

    这是因为在尝试将值(数组)放入其中之前,您从未实际初始化过字典。语法wordDict?可以被认为是&#34;如果wordDict不是nil,那么继续使用表达式的其余部分&#34;。因为它没有被初始化,所以密钥放入字典中从未发生过。以下代码有效:

    var iniArray = ["yikes", "bye"]
    var wordDict: [Int: Array<String>]? = [:] // now `wordDict` is initialized, but still an optional
    wordDict?[0] = iniArray
    wordDict?[0] = ["yikes", "bye", "bike"]
    

    第二行,是字典初始化,可以用几种方式编写,这些都是一样的:

    var wordDict: Dictionary<[String]>? = [:]
    var wordDict: Dictionary<Int, [String]>? = [:]
    var wordDict: Dictionary<Int, [String]>? = Dictionary()
    var wordDict: [Int: [String]]? = [:]
    var wordDict: [Int: [String]]? = Dictionary()
    

    在上述所有情况中,您已初始化可选,空字典。每次尝试使用该字典时,都需要有条件地解包(使用?)或强制解包(使用!,但不鼓励强制解包)。

    另外,如果要为该键附加到数组而不是完全替换它:

    wordDict?[0]?.append("foo")
    

    但这些都是值类型,所以我很确定这仍然会替换wordDict中的数组。

答案 1 :(得分:2)

看起来像是代码的这一部分:

var wordDict: [Int: Array<String>]?

是无心的。在这里,您将整个字典设为可选,这没有多大意义。这就是你想要的(我想象):

var wordDict: [Int: Array<String>]

通常,首选使用数组速记:

var wordDict: [Int: [String]]

无论如何,要将此字典初始化为空字典,您需要这样做:

var wordDict: [Int: [String]] = [:]

然后,要添加初始数组,请执行以下操作:

wordDict[0] = ["yikes", "bye"]

最后,要附加额外元素,请使用optional chaining

wordDict[0]?.append("bike")

如果您 打算让整个字典成为可选字段,那么您只需要一个额外的?

var wordDict: [Int: [String]]? = [:]
wordDict?[0] = ["yikes", "bye"]
wordDict?[0]?.append("bike")
wordDict?[0] // ["yikes", "bye", "bike"]

答案 2 :(得分:-2)