Swift字典错误?

时间:2014-06-03 19:43:23

标签: dictionary swift

所以我在Swift开始了一个项目,我遇到了这个问题:

此代码有效:

var dictionary = ["a":"valueOfA","b":"valueOfB","c":"valueOfC"]
println(dictionary)
dictionary["c"] = "newValOfC"
println(dictionary)

而这不是:

var dictionary = [:]
dictionary = ["a":"valueOfA","b":"valueOfB","c":"valueOfC"]
println(dictionary)
dictionary["c"] = "newValOfC"
println(dictionary)

给出错误:

Playground execution failed: error: <REPL>:35:17: error: cannot assign to the result of this expression
dictionary["c"] = "newValC"
~~~~~~~~~~~~~~~ ^

请注意,这不是一个常数值

那么为什么不行

dictionary = ["a":"valueOfA","b":"valueOfB","c":"valueOfC"]

给出错误?

6 个答案:

答案 0 :(得分:11)

由于上下文没有提供足够的信息来推断类型,你需要明确地将它命名为字典,否则swift假定它是NSDictionary(虽然我不清楚为什么。我假设为了更好的对象兼容性):

以下代码均有效:

// Playground
import UIKit

var str:NSString = "Hello, playground"

var d0 = [:]
var d1: Dictionary = [:]

d0.setValue(UIWebView(), forKey: "asdf")

d1["asdf"] = 1
d1["qwer"] = "qwer"

答案 1 :(得分:3)

好吧,我发现它,问题是通过初始化一个空字典,类型推断变得有点疯狂。

您需要此代码:

var dictionary = Dictionary<String, String>()

而不是

var dictionary = [:]

但仍然没有解释为什么行

dictionary = ["a":"valueOfA","b":"valueOfB","c":"valueOfC"]

不会出错

答案 2 :(得分:3)

参考Swift语言指南,

dictionary = [:]

语法是正确的&#34;如果上下文已经提供了类型信息&#34;。

答案 3 :(得分:2)

最大的不同是

var dictionary = [:]

没有任何机会让编译器推断出正确的类型,而

var dictionary = ["a":"valueOfA","b":"valueOfB","c":"valueOfC"]

确实

实际上看起来第一行产生了__NSDictionaryI个实例,而第二个产生了Dictionary<String,String个实例。

来自 Swift编程语言一书

  

如果上下文已经提供了类型信息,请创建一个空字典,其中包含空字典文字,写为[:](一对方括号内的冒号):

这意味着第一行不​​明确。

答案 4 :(得分:1)

[:]语法仅在当前上下文具有足够的信息才能推断出类型的情况下才有效。以下是了解上下文的一些方法......

正如已经提到的,下面的代码有效,因为可以推断出键和值是字符串:

var dictionary = [ "a" : "valueOfA" , "b" : "valueOfB" , "c" : "valueOfC" ]

传递给函数的字典具有已知的上下文:

func dictionaryFunc(var dictionary : Dictionary<String, String>) {
    // Do stuff with the dictionary
}

在这两种情况下,字典的键/值类型现在都是已知的,因此您可以这样做来创建具有相同变量名称的新字典...

dictionary = [:]

在第一种情况下,如果您在声明后使用了[:]语法,那么您将删除原始字典的内容。在第二种情况下,字典在传递给函数时会被复制,因此使用[:]只会删除副本。

答案 5 :(得分:1)

在Swift 2.0中,我正在使用它:

var dictionary = [String:String]()
dictionary["key1"] = "value1"