Swift学习:2.4 集合类型
参考Swift 官方教程《The Swift Programming Language》中文版
集合类型 (Collection Types)Swift 语言提供经典的数组和字典两种集合类型来存储集合数据。数组用来按顺序存储相同类型的数据。字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对)。 Swift 语言里的数组和字典中存储的数据值类型必须明确。 这意味着我们不能把不正确的数据类型插入其中。 同时这也说明我们完全可以对获取出的值类型非常自信。 Swift 对显式类型集合的使用确保了我们的代码对工作所需要的类型非常清楚,也让我们在开发中可以早早地找到任何的类型不匹配错误。
数组数组使用有序列表存储同一类型的多个值。相同的值可以多次出现在一个数组的不同位置中。 Swift 数组特定于它所存储元素的类型。这与 Objective-C 的 NSArray 和 NSMutableArray 不同,这两个类可以存储任意类型的对象,并且不提供所返回对象的任何特别信息。在 Swift 中,数据值在被存储进入某个数组之前类型必须明确,方法是通过显式的类型标注或类型推断,而且不是必须是 数组的简单语法写 Swift 数组应该遵循像 数组构造语句我们可以使用字面量来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。字面量是一系列由逗号分割并由方括号包含的数值。 下面这个例子创建了一个叫做 var shoppingList: [String] = ["Eggs","Milk"]
// shoppingList 已经被构造并且拥有两个初始项。
在这个例子中,字面量仅仅包含两个 由于 Swift 的类型推断机制,当我们用字面量构造只拥有相同类型值数组的时候,我们不必把数组的类型定义清楚。 var shoppingList = ["Eggs","Milk"]
因为所有字面量中的值都是相同的类型,Swift 可以推断出 访问和修改数组我们可以通过数组的方法和属性来访问和修改数组,或者下标语法。 还可以使用数组的只读属性 println("The shopping list contains (shoppingList.count) items.")
// 输出"The shopping list contains 2 items."(这个数组有2个项)
使用布尔项 if shoppingList.isEmpty {
println("The shopping list is empty.")
} else {
println("The shopping list is not empty.")
}
// 打印 "The shopping list is not empty."(shoppinglist不是空的)
也可以使用 shoppingList.append("Flour")
// shoppingList 现在有3个数据项,有人在摊煎饼
除此之外,使用加法赋值运算符( shoppingList += ["Baking Powder"]
// shoppingList 现在有四项了
shoppingList += ["Chocolate Spread","Cheese","Butter"]
// shoppingList 现在有七项了
可以直接使用下标语法来获取数组中的数据项,把我们需要的数据项的索引值放在直接放在数组名称的方括号中: var firstItem = shoppingList[0]
// 第一项是 "Eggs"
注意第一项在数组中的索引值是 我们也可以用下标来改变某个已有索引值对应的数据值: shoppingList[0] = "Six eggs"
// 其中的第一项现在是 "Six eggs" 而不是 "Eggs"
还可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的。下面的例子把 shoppingList[4...6] = ["Bananas","Apples"]
// shoppingList 现在有六项
调用数组的 shoppingList.insert("Maple Syrup",atIndex: 0)
// shoppingList 现在有7项
// "Maple Syrup" 现在是这个列表中的第一项
这次 类似的我们可以使用 let mapleSyrup = shoppingList.removeAtIndex(0)
// 索引值为0的数据项被移除
// shoppingList 现在只有6项,而且不包括Maple Syrup
// mapleSyrup常量的值等于被移除数据项的值 "Maple Syrup"
数据项被移除后数组中的空出项会被自动填补,所以现在索引值为 firstItem = shoppingList[0]
// firstItem 现在等于 "Six eggs"
如果我们只想把数组中的最后一项移除,可以使用 let apples = shoppingList.removeLast()
// 数组的最后一项被移除了
// shoppingList现在只有5项,不包括cheese
// apples 常量的值现在等于"Apples" 字符串
数组的遍历我们可以使用 for item in shoppingList {
println(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
如果我们同时需要每个数据项的值和索引值,可以使用全局 for (index,value) in enumerate(shoppingList) {
println("Item (index + 1): (value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas
更多关于 创建并且构造一个数组我们可以使用构造语法来创建一个由特定数据类型构成的空数组: var someInts = [Int]()
println("someInts is of type [Int] with (someInts.count) items。")
// 打印 "someInts is of type [Int] with 0 items。"(someInts是0数据项的Int[]数组)
注意 除此之外,如果代码上下文中提供了类型信息, 例如一个函数参数或者一个已经定义好类型的常量或者变量,我们可以使用空数组语句创建一个空数组,它的写法很简单: someInts.append(3)
// someInts 现在包含一个INT值
someInts = []
// someInts 现在是空数组,但是仍然是[Int]类型的。
Swift 中的 var threeDoubles = [Double](count: 3,repeatedValue:0.0)
// threeDoubles 是一种 [Double]数组,等于 [0.0,0.0,0.0]
因为类型推断的存在,我们使用这种构造方法的时候不需要特别指定数组中存储的数据类型,因为类型可以从默认值推断出来: var anotherThreeDoubles = Array(count: 3,repeatedValue: 2.5)
// anotherThreeDoubles is inferred as [Double],and equals [2.5,2.5,2.5]
最后,我们可以使用加法操作符( var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles 被推断为 [Double],2.5]
字典字典是一种存储多个相同类型的值的容器。每个值(value)都关联唯一的键(key),键作为字典中的这个值数据的标识符。和数组中的数据项不同,字典中的数据项并没有具体顺序。我们在需要通过标识符(键)访问数据的时候使用字典,这种方法很大程度上和我们在现实世界中使用字典查字义的方法一样。 Swift 的字典使用时需要具体规定可以存储键和值类型。不同于 Objective-C 的 Swift 的字典使用
字典字面量我们可以使用字典字面量来构造字典,它们和我们刚才介绍过的数组字面量拥有相似语法。一个字典字面量是一个定义拥有一个或者多个键值对的字典集合的简单语句。 一个键值对是一个 [key 1: value 1,key 2: value 2,key 3: value 3]
下面的例子创建了一个存储国际机场名称的字典。在这个字典中键是三个字母的国际航空运输相关代码,值是机场名称: var airports: [String:String] = ["TYO": "Tokyo","DUB": "Dublin"]
这个字典语句包含了两个 和数组一样,如果我们使用字面量构造字典就不用把类型定义清楚。 var airports = ["TYO": "Tokyo","DUB": "Dublin"]
因为这个语句中所有的键和值都分别是相同的数据类型,Swift 可以推断出 读取和修改字典我们可以通过字典的方法和属性来读取和修改字典,或者使用下标语法。和数组一样,我们可以通过字典的只读属性 println("The dictionary of airports contains (airports.count) items.")
// 打印 "The dictionary of airports contains 2 items."(这个字典有两个数据项)
可以使用布尔属性 if airports.isEmpty {
println("The airports dictionary is empty.")
} else {
println("The airports dictionary is not empty.")
}
// 打印 "The airports dictionary is not empty.(这个字典不为空)"
我们也可以在字典中使用下标语法来添加新的数据项。可以使用一个合适类型的 key 作为下标索引,并且分配新的合适类型的值: airports["LHR"] = "London"
// airports 字典现在有三个数据项
我们也可以使用下标语法来改变特定键对应的值: airports["LHR"] = "London Heathrow"
// "LHR"对应的值 被改为 "London Heathrow
作为另一种下标方法,字典的
if let oldValue = airports.updateValue("Dublin Internation",forKey: "DUB") {
println("The old value for DUB was (oldValue).")
}
// 输出 "The old value for DUB was Dublin."(DUB原值是dublin)
我们也可以使用下标语法来在字典中检索特定键对应的值。由于使用一个没有值的键这种情况是有可能发生的,可选类型返回这个键存在的相关值,否则就返回 if let airportName = airports["DUB"] {
println("The name of the airport is (airportName).")
} else {
println("That airport is not in the airports dictionary.")
}
// 打印 "The name of the airport is Dublin Internation."(机场的名字是都柏林国际)
我们还可以使用下标语法来通过给某个键的对应值赋值为 airports["APL"] = "Apple Internation"
// "Apple Internation"不是真的 APL机场,删除它
airports["APL"] = nil
// APL现在被移除了
另外, if let removedValue = airports.removeValueForKey("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."
字典遍历我们可以使用 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
如果我们只是需要使用某个字典的键集合或者值集合来作为某个接受 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 是一个空的 Dictionary<Int,String>
这个例子创建了一个 如果上下文已经提供了信息类型,我们可以使用空字典字面量来创建一个空字典,记作 namesOfIntegers[16] = "sixteen"
// namesOfIntegers 现在包含一个键值对
namesOfIntegers = [:]
// namesOfIntegers 又成为了一个 Int,String类型的空字典
集合的可变性数组和字典都是在单个集合中存储可变值。如果我们创建一个数组或者字典并且把它分配成一个变量,这个集合将会是可变的。这意味着我们可以在创建之后添加更多或移除已存在的数据项来改变这个集合的大小。与此相反,如果我们把数组或字典分配成常量,那么它就是不可变的,它的大小不能被改变。 对字典来说,不可变性也意味着我们不能替换其中任何现有键所对应的值。不可变字典的内容在被首次设定之后不能更改。 不可变性对数组来说有一点不同,当然我们不能试着改变任何不可变数组的大小,但是我们可以重新设定相对现存索引所对应的值。这使得 Swift 数组在大小被固定的时候依然可以做的很棒。 Swift 数组的可变性行为同时影响了数组实例如何被分配和修改,想获取更多信息,请参见集合在赋值和复制中的行为。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |