Dictionary 斯威夫特字典虫?

Dictionary 斯威夫特字典虫?,dictionary,swift,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":"val

所以我在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"
~~~~~~~~~~~~~~~ ^

给出一个错误?

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

您将需要以下代码:

var dictionary = Dictionary<String, String>()
但这仍然不能解释为什么会这样

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

没有给出错误

最大的区别是

var dictionary = [:]
不会让编译器推断出正确的类型,而

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


实际上,看起来第一行生成了一个
\u NSDictionaryI
实例,而第二行生成了一个
字典,并参考了Swift语言指南

dictionary = [:]

语法是正确的,“如果上下文已经提供了类型信息”。

由于上下文没有提供足够的信息来推断类型,您需要将其显式命名为字典,否则swift会假定它是一个
NSDictionary
(我不清楚为什么。我假定是为了更好的obj-c兼容性):

以下代码适用于所有工程:

// Playground
import UIKit

var str:NSString = "Hello, playground"

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

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

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

[:]
语法只有在当前上下文有足够的信息来推断类型时才起作用。以下是一些了解上下文的方法

如前所述,下面的代码之所以有效,是因为可以推断键和值是字符串:

var dictionary = [ "a" : "valueOfA" , "b" : "valueOfB" , "c" : "valueOfC" ]
传递到函数中的字典具有已知上下文:

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

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

在Swift 2.0中,我使用的是:

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

那么,为什么第二行没有给出错误呢?这一定是类型推断器的一些怪癖,但第一行的所有内容都是模棱两可的。我同意
dictionary=[:]
创建
NSDictionary
,但我不知道为什么基本上不是初始化
字典
,只是将其变为空。@GokhanArik[:]无法推断出此字典文本的键值类型。所以默认情况下它是NSDictionary。只是猜测:可能允许将字典分配给NSDictionary。我没有访问编译器的权限。您可能希望检查赋值后的动态类型和/或使用字典值声明另一个
var-anotherDictionary=[..]
,并查看是否可以赋值
Dictionary=anotherDictionary
(再次检查赋值后的动态类型)。
func dictionaryFunc(var dictionary : Dictionary<String, String>) {
    // Do stuff with the dictionary
}
dictionary = [:]
var dictionary = [String:String]()
dictionary["key1"] = "value1"