如果我想为词典定义typealias
,其中String
为键,String
为值,但我也希望它能接受{{1} ,其中一个定义是正确的?
nil
或
typealias dictString = Dictionary<String, String?>
或
typealias dictString = Dictionary<String, String>
或
typealias dictString = [String:String?]
因为我使用第一个,现在每次我想要打开一个值,我需要打开它两次(例如typealias dictString = [String:String]
)所以我开始想知道我是否真的需要添加问号或不(但我需要字典才能取nil值)。感谢。
答案 0 :(得分:5)
第二个和第四个没问题。
在大多数情况下,您不需要使值可选。即使您未将值声明为可选类型,也可以将键的值设置为nil
:
var dict = [String: String]()
dict["Hello"] = nil
当您访问"Hello"
时,它会返回nil
。奇妙!
事实上,将密钥的值设置为nil
意味着删除密钥&#34;。如果您不知道这一点,这可能会导致意外结果。
例如,
var dict = [String: String]()
dict["Hello"] = nil
print(dict.keys.contains("Hello"))
打印false
。
如果您需要检查某个密钥是否存在,即使其值为nil
,那么您必须将该值设为可选类型。
答案 1 :(得分:1)
对于任何不存在的密钥,字典将返回nil
。现在,如果您希望能够实际存在密钥但值为nil,那么版本1
和3
是可行的方法,您可以保持双重展开。否则,请使用2
或4
。
<强>更新强>
示例:强>
版本1&amp; 3:
typealias DictString = Dictionary<String, String?> // or [String: String?]
var myDict: DictString = ["MyKey1": "MyVal1", "MyKey2": nil]
var value1: String? = myDict["MyKey1"]! // This is an Optional String so you'd need to unwrap it
var value2: String? = myDict["MyKey2"]! // This will return nil
第2版&amp; 4:
typealias DictString = Dictionary<String, String> // or [String: String]
var myDict: DictString = ["MyKey1": "MyVal1"]
var value1: String? = myDict["MyKey1"] // This is an Optional String so you'd need to unwrap it
var value2: String? = myDict["MyKey2"] // This will return nil
现在两者之间的区别在于第一种情况实际存储了密钥。所以,如果你这样做:
var allKeys: [String] = Array(myDict.keys)
您将获得两种不同的结果:
1&amp; 3:allKeys
将为["MyKey1", "MyKey2"]
2&amp; 4:allKeys
将为["MyKey1"]
P.S:一个好的做法是使用大写的类型&#39;名。因此,我建议您将typealias
更改为DictString
。