Dictionary 斯威夫特字典虫?
所以我在Swift开始了一个项目,我遇到了这个问题: 此代码适用于: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
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"