字典是一个容器,它存储多个相同类型的值。每个值都与一个唯一的密钥,它作为一个标识符字典内的值相关联。不像在一个数组项,在字典中的项目没有一个指定的顺序。您可以使用一本字典,当你需要查找基于其标识符值,在大致相同的方式,一个真实世界的字典来查找定义为一个特定的词。
Swift的字典不同于Objective-C的NSDictionary中和的NSMutableDictionary类,它可以使用任何类型的对象作为其键和值,不提供有关这些对象的性质的任何信息。Swift,钥匙和一个特定的字典可存储的值类型总是明确,无论是通过显式类型批注或通过类型推断。
Swift的字典类型写为Dictionary<KeyType,ValueType>,其中KeyType的是价值,可以用来作为字典的键的类型和值类型是值类型的字典中存储这些密钥。
唯一的限制是,关键字类型必须是可哈希的,也就是说,它必须提供一种方式,使自己唯一表示的。所有的斯威夫特的基本类型(如字符串,整数,双精度和布尔)是哈希默认情况下,所有这些类型都可以作为字典的键。无关联的值枚举成员的值(如枚举描述)也可哈希的默认。
您可以初始化字典与字典的文本,这也有类似的语法文字前面见过的数组。字典文字是一种简写方式来写一个或多个键 - 值对的字典集合。
一键 - 值对的键和值的组合。在字典中的文字,在每个键 - 值对的键和值用冒号隔开。键 - 值对被写为一个列表,以逗号分隔,由一对方括号括:
[key1:value1, key2: value2, key3: value3]
下面的示例创建一个字典来存储国际机场的名字。在字典中,键是三个字母的国际航空运输协会代码和值是机场名称:
var airports: Dictionary<String, String>= ["TYO": "Tokyo","DUB": "Dublin"]
airports字典包含两个键 - 值对初始化。第一对具有“TYO”的键和“Tokyo”的值。第二对具有“DUB”的键和“Dublin”的值。
这本词典的文字包含两个字符串:字符串对。这符合airports变量声明的类型(只有String键,只有字符串值的字典)等的字典文字的赋值是允许的,以此来初始化airports字典,两个初始项目。
正如数组,你不必写字典的类型,如果你初始化它与一个字典文字,其键和值具有一致的类型。机场的初始化可能已被写入一个较短的形式,而不是在:
var airports = ["TYO": "Tokyo", "DUB":"Dublin"]
因为在字面的所有键都是同一类型,同样所有的值都是相同类型的对方,Swift可以推断词典<String, String>,字符串是正确的类型要用于airports字典。
访问和修改字典
可以访问和修改一个字典,通过它的方法和属性,或使用下标语法。正如一个数组,你可以找出项目在字典的count属性计数来检查个数:
println("The dictionary ofairports contains \(airports.count) items.")
// prints "The dictionary of airports contains 2 items."
您可以添加一个新的项目到与标语法字典。使用适当类型的新键作为下标索引,并指定相应类型的新值:
airports["LHR"] = "London"
// theairports dictionary now contains 3 items
你也可以改变”LHR”的值
airports["LHR"] = "London Heathrow"
// the value for "LHR" has been changed to "LondonHeathrow"
使用字典的updateValue(forKey:)方法来设置或更新一个特定的键的值。像上面的例子标,该updateValue(forKey:)方法设置一个值,如果不存在一个键,或更新,如果该键已经存在的价值。不像一个下标,但是,updateValue(forKey:)方法执行更新后返回旧值。这使您可以检查是否没有更新发生。
if let oldValue = airports.updateValue("Dublin International", forKey: "DUB"){
println("The old value for DUB was \(oldValue).")
}
// prints "The old value for DUB was Dublin."
您也可以使用下标语法来从字典为特定的键检索值。因为它有可能要求对没有存在价值的关键,字典的下标返回字典的值类型的可选值。如果字典包含请求的密钥值,下标返回一个包含该键的现有值的可选值。否则,下标返回nil:
if let airportName = airports["DUB"]{
println("The name of the airport is \(airportName).")
}else{
println("That airport is not in the airportsdictionary.")
}
//prints "The name of the airport is Dublin International."
您可以使用下标语法来通过该键的分配为零的值从字典中删除一个键 - 值对:
airports["APL"] = "Apple International"
// "Apple International" is not the real airport for APL, sodelete it
airports["APL"] = nil
// APLhas now been removed from the dictionary
另外,从与removeValueForKey法词库中删除一个键 - 值对。此方法删除的键值对,如果它存在,并返回被删除的值,或者返回nil,如果存在没有价值:
if let removedValue = airports.removeValueForKey("DUB") {
println("The removed airport'sname is \(removedValue).")
}else{
prints "The removed airport's name is Dublin International."
}
//prints "The removed airport's name is Dublin International."
遍历一个字典
我们可以使用for-in来遍历一个字典
for (airportCode, airportName)in airports {
println("\(airportCode): \(airportName)")
}
. // TYO:Tokyo
. // LHR:London Heathrow
也可以通过访问其键和值检索的字典的键或值的可重复的集合特性:
for airportCode in airports.keys {
println("Airport code: \(airportCode)")
}
. // Airport code: TYO
. // Airport code: LHR
for airportName in airports.values {
println("Airport name: \(airportName)")
}
// Airport name: Tokyo
//Airport name: London Heathrow
如果需要使用字典的键或值与一个API,它需要一个Array实例,初始化一个新的数组中的键或值属性:
. let airportCodes = Array(airports.keys)
. //airportCodes is ["TYO", "LHR"]
. let airportNames = Array(airports.values)
. //airportNames is ["Tokyo", "London Heathrow"]
初始化一个字典
. var namesOfIntegers = Dictionary<Int, String>()
. // namesOfIntegers is an emptyDictionary<Int, String>