第三章
Collection Types (集合类型)
在Swift中,提供了两种集合类型用来存储一组值:数组和字典.数组有序的存储相同类型的值;字典存储无序的相同类型的值.字典可以通过唯一的标识(就是所说的键)来查询和访问.
在Swift中,数组和字典总是要清晰的标明他们存储数据的类型.这就意味着不可以将错误的类型插入到数组或字典中.同时也意味着你是明确了解你要遍历的数组或字典里面数据的类 型.在Swift中,集合要显式的声明类型来保证在开发中都会明确的知道它能处理的数据类型.
注意点:
在Swift中,数组(Array)被赋值或者被传递给函数或方法时,会与其他类型有不所同的.
Arrays (数组)
数组可以顺序的储存一组相同类型的值.相同的值可以在数组的不同位置出现多次.
在Swift中,数组是存储指定的某种类型值.这与OC中的NSArray类和NSMutableArray类不同,OC中他们可以存储不同类型的值.在Swift中,数组存储的值的类型必须明确.如果你声明 了一个Int的数组,你不可以存储Int类型之外的值.在Swift中,数组是类型安全的,并且要明确声明它存储值的类型.
Array Type Shorthand Syntax (数组类型缩写语法)
在Swift中,数组的完整写法是:Array<SomeType>,这里的SomeType是数组可以存储的类型.数组也可以使用缩写的方式: SomeType[].尽管这两种形式在功能上是相同的,但我们推 荐使用缩写.本手册中都会使用缩写方式.
Array Literals (文本数组)
文本数组是在中括号[]中使用逗号(,)分隔开的一列值,并可以使用文本对数组进行初始化操作:
[value 1, value 2, value 3]
下面的代码例子中,创建了一个叫做shoppingList的数组来存储字符串(String)类型的值:
var shoppingList: String[] = ["Eggs", "Milk"]
// shoppingList 通过两个字符串元素进行初始化
通过 String[]的写法,使变量 shoppingList被定义为字符串类型的数组.因此数组只能存储Striing(字符串)类型的值.这里,数组 shoppingList通过两个String类型值("Eggs" and "Milk") 来初始化.
注意点:
shoppingList数组被定义为变量(使用var关键字)而不是常量,是因为要在后面的代码例子中要给数组添加更多的元素.
在这个例子中,文本数组包含两个String(字符串)类型的值.这与变量shoppingList的类型刚好匹配.因此通过使用两个字符串元素给数组赋值来作为一种数组初始化的方式是被允许的.
由于在Swift中有类型预测机制,在使用文本内容的值来初始化文本数组的时候,可以不必写明数组的类型.因此,shoppingList的初始化可以被缩写为:
var shoppingList = ["Eggs", "Milk"]
因为在数组里的所有值都是同一种类型,Swift可以判断出变量 shoppingList的正确类型是 String[]
Accessing and Modifying an Array (数组的访问和修改)
使用数值的方法和属性,可以访问和修改数组,或者使用数组下标进行.
查看一个数组的元素个数,使用它的只读属性:count
println("The shopping list contains (shoppingList.count) items.")
// prints "The shopping list contains 2 items.”
使用布尔类型的属性isEmpty可以检测数组的count属性值是否等于0:
if shoppingList.isEmpty {
println("The shopping list is empty.")
} else {
println("The shopping list is not empty.")
}
// prints "The shopping list is not empty.”
使用数组的append方法,可以添加一个新的元素到数组的最后面:
shoppingList.append("Flour")
// shoppingList now contains 3 items, and someone is making pancakes”
或者,也可以使用复合赋值操作符(+=)给数组添加一个新元素在数组的末尾:
shoppingList += "Baking Powder"
// shoppingList now contains 4 items
当然,你也可以使用复合赋值操作符(+=)添加一个相同元素类型的数组:
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList now contains 7 items
从数组中提取一个值,使用下标:在数组名后面的中括号[]里,写上你需要提取值的索引
var firstItem = shoppingList[0]
// firstItem is equal to "Eggs”
注意,数组的第一个元素的索引是0而不是1.在Swift中,所有数组都是以0开始的.
可以通过下标来改变数组中相应索引的元素值:
shoppingList[0] = "Six eggs"
// the first item in the list is now equal to "Six eggs" rather than "Eggs”
使用下标也可以改变数组中一定范围的值,甚至替换一组值,哪怕替换的长度与你指定的范围不相同.下面的代码例子将“Chocolate Spread", "Cheese", 和 "Butter" 替换 成"Bananas" 和"Apples":
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList now contains 6 items”
注意点:
不可以使用下标的方式类给数组添加新的元素.如果你使用的数组下标超出了数组的边界,将会触发一个运行错误.其实你可以在使用下标之前,通过比较数组的count属性来检查下标索 引是否合法.除非数组的count值是0(这意味着数组是空的),否则数组最大的索引下标值总是count - 1,因为数组的索引是从0开始的.