首页 > 代码库 > The Swift Programming Language-官方教程精译Swift(5)集合类型 -- Collection Types
The Swift Programming Language-官方教程精译Swift(5)集合类型 -- Collection Types
Swift语言提供经典的数组和字典两种集合类型来存储集合数据。数组用来按顺序存储相同类型的数据。字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对)。
1 var shoppingList: String[] = ["Eggs", "Milk"] 2 // shoppingList 已经被构造并且拥有两个初始项。
1 var shoppingList = ["Eggs", "Milk"]
1 println("The shopping list contains \(shoppingList.count) items.") 2 // 打印出"The shopping list contains 2 items."(这个数组有2个项)
1 if shoppingList.isEmpty { 2 println("The shopping list is empty.") 3 } else { 4 println("The shopping list is not empty.") 5 } 6 // 打印 "The shopping list is not empty."(shoppinglist不是空的)
1 shoppingList.append("Flour") 2 // shoppingList 现在有3个数据项,有人在摊煎饼
除此之外,使用加法赋值运算符(+=)也可以直接在数组后面添加数据项:
1 shoppingList += "Baking Powder" 2 // shoppingList 现在有四项了
我们也可以使用加法赋值运算符(+=)直接添加拥有相同类型数据的数组。
1 shoppingList += ["Chocolate Spread", "Cheese", "Butter"] 2 // shoppingList 现在有7项了
可以直接使用下标语法来获取数组中的数据项,把我们需要的数据项的索引值放在直接放在数组名称的方括号中:
1 var firstItem = shoppingList[0] 2 // 第一项是 "Eggs"
1 shoppingList[0] = "Six eggs" 2 // 其中的第一项现在是 "Six eggs" 而不是 "Eggs"
还可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的。下面的例子把"Chocolate Spread","Cheese",和"Butter"替换为"Bananas"和 "Apples":
1 shoppingList[4...6] = ["Bananas", "Apples"] 2 // shoppingList 现在有六项
注意: 我们不能使用下标语法在数组尾部添加新项。如果我们试着用这种方法对索引越界的数据进行检索或者设置新值的操作,我们会引发一个运行期错误。我们可以使用索引值和数组的count属性进行比较来在使用某个索引之前先检验是否有效。除了当count等于0时(说明这是个空数组),最大索引值一直是count - 1,因为数组都是零起索引。
1 shoppingList.insert("Maple Syrup", atIndex: 0) 2 // shoppingList 现在有7项 3 // "Maple Syrup" 现在是这个列表中的第一项
这次insert函数调用把值为"Maple Syrup"的新数据项插入shopping列表的最开始位置,并且使用0作为索引值。
1 let mapleSyrup = shoppingList.removeAtIndex(0) 2 //索引值为0的数据项被移除 3 // shoppingList 现在只有6项,而且不包括Maple Syrup 4 // mapleSyrup常量的值等于被移除数据项的值 "Maple Syrup"
数据项被移除后数组中的空出项会被自动填补,所以现在索引值为0的数据项的值再次等于"Six eggs":
1 firstItem = shoppingList[0] 2 // firstItem 现在等于 "Six eggs"
如果我们只想把数组中的最后一项移除,可以使用removeLast方法而不是removeAtIndex方法来避免我们需要获取数组的count属性。就像后者一样,前者也会返回被移除的数据项:
1 let apples = shoppingList.removeLast() 2 // 数组的最后一项被移除了 3 // shoppingList现在只有5项,不包括cheese 4 // apples 常量的值现在等于"Apples" 字符串
1 for item in shoppingList { 2 println(item) 3 } 4 // Six eggs 5 // Milk 6 // Flour 7 // Baking Powder 8 // Bananas
1 for (index, value) in enumerate(shoppingList) { 2 println("Item \(index + 1): \(value)") 3 } 4 // Item 1: Six eggs 5 // Item 2: Milk 6 // Item 3: Flour 7 // Item 4: Baking Powder 8 // Item 5: Bananas
1 var someInts = Int[]() 2 println("someInts is of type Int[] with \(someInts。count) items。") 3 // 打印 "someInts is of type Int[] with 0 items。"(someInts是0数据项的Int[]数组)
1 someInts.append(3) 2 // someInts 现在包含一个INT值 3 someInts = [] 4 // someInts 现在是空数组,但是仍然是Int[]类型的。
1 var threeDoubles = Double[](count: 3, repeatedValue:0.0) 2 // threeDoubles 是一种 Double[]数组, 等于 [0.0, 0.0, 0.0]
1 var anotherThreeDoubles = Array(count: 3, repeatedValue: 2.5) 2 // anotherThreeDoubles is inferred as Double[], and equals [2.5, 2.5, 2.5]
1 var sixDoubles = threeDoubles + anotherThreeDoubles 2 // sixDoubles 被推断为 Double[], 等于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
1 [key 1: value 1, key 2: value 2, key 3: value 3]
1 var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
1 var airports = ["TYO": "Tokyo", "DUB": "Dublin"]
1 println("The dictionary of airports contains \(airports.count) items.") 2 // 打印 "The dictionary of airports contains 2 items."(这个字典有两个数据项)
我们也可以在字典中使用下标语法来添加新的数据项。可以使用一个合适类型的key作为下标索引,并且分配新的合适类型的值:
1 airports["LHR"] = "London" 2 // airports 字典现在有三个数据项
我们也可以使用下标语法来改变特定键对应的值:
1 airports["LHR"] = "London Heathrow" 2 // "LHR"对应的值 被改为 "London Heathrow
作为另一种下标方法,字典的updateValue(forKey:)方法可以设置或者更新特定键对应的值。就像上面所示的示例,updateValue(forKey:)方法在这个键不存在对应值的时候设置值或者在存在时更新已存在的值。和上面的下标方法不一样,这个方法返回更新值之前的原值。这样方便我们检查更新是否成功。
1 if let oldValue = http://www.mamicode.com/airports.updateValue("Dublin Internation", forKey: "DUB") { 2 println("The old value for DUB was \(oldValue).") 3 } 4 // 打印出 "The old value for DUB was Dublin."(dub原值是dublin)
1 if let airportName = airports["DUB"] { 2 println("The name of the airport is \(airportName).") 3 } else { 4 println("That airport is not in the airports dictionary.") 5 } 6 // 打印 "The name of the airport is Dublin INTernation."(机场的名字是都柏林国际)
1 airports["APL"] = "Apple Internation" 2 // "Apple Internation"不是真的 APL机场, 删除它 3 airports["APL"] = nil 4 // APL现在被移除了
另外,removeValueForKey方法也可以用来在字典中移除键值对。这个方法在键值对存在的情况下会移除该键值对并且返回被移除的value或者在没有值的情况下返回nil:
1 if let removedValue = http://www.mamicode.com/airports.removeValueForKey("DUB") { 2 println("The removed airport‘s name is \(removedValue).") 3 } else { 4 println("The airports dictionary does not contain a value for DUB.") 5 } 6 // 打印 "The removed airport‘s name is Dublin International."(被移除的机场名字是都柏林国际)
1 for (airportCode, airportName) in airports { 2 prINTln("\(airportCode): \(airportName)") 3 } 4 // TYO: Tokyo 5 // LHR: London Heathrow
1 for airportCode in airports.keys { 2 prINTln("Airport code: \(airportCode)") 3 } 4 // Airport code: TYO 5 // Airport code: LHR 6 7 for airportName in airports.values { 8 prINTln("Airport name: \(airportName)") 9 } 10 // Airport name: Tokyo 11 // Airport name: London Heathrow
1 let airportCodes = Array(airports.keys) 2 // airportCodes is ["TYO", "LHR"] 3 4 let airportNames = Array(airports.values) 5 // airportNames is ["Tokyo", "London Heathrow"]
注意: Swift 的字典类型是无序集合类型。其中字典键,值,键值对在遍历的时候会重新排列,而且其中顺序是不固定的。
1 var namesOfIntegers = Dictionary<Int, String>() 2 // namesOfIntegers 是一个空的 Dictionary<Int, String>
1 namesOfIntegers[16] = "sixteen" 2 // namesOfIntegers 现在包含一个键值对 3 namesOfIntegers = [:] 4 // namesOfIntegers 又成为了一个 Int, String类型的空字典
注意: 在后台,Swift 的数组和字典都是由泛型集合来实现的,想了解更多泛型和集合信息请参见泛型。