创建字典类型的正确方法是什么?

时间:2017-02-14 08:09:28

标签: swift dictionary

如果我想为词典定义typealias,其中String为键,String为值,但我也希望它能接受{{1} ,其中一个定义是正确的?

nil

typealias dictString = Dictionary<String, String?>

typealias dictString = Dictionary<String, String>

typealias dictString = [String:String?]

因为我使用第一个,现在每次我想要打开一个值,我需要打开它两次(例如typealias dictString = [String:String] )所以我开始想知道我是否真的需要添加问号或不(但我需要字典才能取nil值)。感谢。

2 个答案:

答案 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,那么版本13是可行的方法,您可以保持双重展开。否则,请使用24

<强>更新

示例:

版本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