airports 字典被定义为 Dictionary<String, String> ,这意味着这个字典的键和值都是 String 类型。
创建一个空字典
//这个例子创建了一个 Int - String 类型的空字典来储存英语对应的整数。它的键是 Int 型,值是 String 型。
var namesOfIntegers = Dictionary<Int, String>()
注意:airports字典被声明为变量(用var关键字)而不是常量(let关键字)因为后来更多的机场信息会被添加到这个字典中。
var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
和数组一样,构造字典就也可以不用把类型定义清楚(Swift 的类型推断)。airports 也可以用这种简短方法定义:
var airports1 = ["TYO": "Tokyo", "DUB": "Dublin"]
这个语句中所有的键和值都分别是相同的数据类型,Swift 可以推断出 airports 的字典类型是 Dictionary<String, String>。
修改值
//如果可以存在, 则进行替换value. 如果key不存在则进项添加键值对
airports["LHR"] = "London"
//如果key存在则进行更新, 返回key对应的value值
let vault = airports.updateValue("12121", forKey: "DUB")
//如果key不存在则进行添加. 返回nil
let vault1 = airports.updateValue("12121", forKey: "DUB")
//推荐使用airports.updateValue, 可以进行判断是否为nil
删除值
通过使用下标语法给某个键对应的值赋值为 nil ,来从字典里移除一个键值对。
airports["APL"] = "Apple International"
// "Apple International" is not the real airport for APL, so delete it
airports["APL"] = nil
// APL has now been removed from the dictionary
另外,removeValueForKey 方法也可以用来从字典中移除键值对。如果键值对存在,移除该键值对并且返回被移除的 value;否则返回 nil:
if let removedValue = airports.removeValue(forKey: "DUB")
{
println("The removed airport's name is \(removedValue).")
} else {
println("The airports dictionary does not contain a value for DUB.")
}
// prints "The removed airport's name is Dublin International."
LazyMapCollection
和OC不同的是, airports.keys和airports.keys返回的不是数组, 而是LazyMapCollection, 如果想像OC那样获取一个数组
使用let airportCodes = Array(airports.keys)转成数组
具体LazyMapCollection
的使用,请查阅官方文档, 此篇文章不做过多解释, 会在后续的文章中说明
数组和字典都是在集合中存储值。如果创建一个数组或者字典时把它分配给一个变量,那么它们是可变的。这意味着在创建后可以通过添加、移除元素来改变这个集合。相反,如果把数组或字典分配给常量,那么它们就不能被改变。
对字典来说,不可变性也意味着不能替换其中任何现有键所对应的值。不可变字典在被首次设置以后就不能更改。 不可变性对数组来说有一点不同,当然我们不能试图改变不可变数组的大小,但是可以重新设值索引对应的值。这使得 Swift 数组在大小被设定以后依然可以灵活使用。
Swift 数组的可变性影响了数组实例的分配和修改,想获取更多信息,请参见集合在赋值和复制中的行为。
注意:在数组大小不需要改变的时候,创建不可变数组是个很好的习惯。Swift 编译器会优化这样的集合。
定义一个字典
//定义字典时没有赋值, 需要指定类型
var contact = Dictionary<String,Any>()
contact["title"] = "123"
//对于上面的定义方法, 还可以这样写
var contact1 = [String : Any]()
contact1["abc"] = "kop"
contact1
var airports: Dictionary<String, String> = [:]
airports["key"] = "qianqian"
//对于上面的定义方法, 还可以这样写
var airports1:[String : Any] = [:]
airports1["key"] = "qianqian"
airports1
//定义字典时给字典赋初始值, 不需要再次指定字典的类型, 会进行自动推断
var airports1 = ["TYO": "Tokyo", "DUB": "Dublin"]
定义一个可选字典
var data[String:Int]?