数组
数组使用有序列表存储相同类型的多重数据。相同的值可以多次出现在一个数组的不同位置中。
写 Swift 数组应该遵循像 Array<SomeType>这样的形式,其中 sometype 是这个数组中唯一允许存在的数据类型。 我们也可以使用像 SomeType[]这样的简单语法。 尽管两种形式在功能上是一样的, 但是我们推荐较短的那种,而且在本文中都会使用这种形式来使用数组。
数组构造语句
我们可以使用字面语句来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。字面语句是一系列由逗号分割并由方括号包含的数值。 [value 1, value 2, value 3]。
下面这个例子创建了一个叫做 shoppingList 并且存储字符串的数组:
1. var shoppingList: String[] = ["Eggs", "Milk"]
2. // shoppingList 已经被构造并且拥有两个初始项。
shoppingList 变量被声明为“字符串值类型的数组“,记作 String[]。 因为这个数组被规定只有 String 一种数据结构,所以只有 String 类型可以在其中被存取。 在这里,shoppinglist数组由两个 String 值("Eggs" 和"Milk")构造,并且由字面语句定义。
注意: Shoppinglist 数组被声明为变量(var 关键字创建)而不是常量(let 创建)是因为以后可能会有更多的数据项被插入其中。 由 于 Swift 的类型推断机制,当我们用字面语句构造只拥有相同类型值数组的时候,我们不必把数组的类型定义清楚。 shoppinglist 的构造也可以这样写:
1. var shoppingList = ["Eggs", "Milk"]
我们可以通过数组的方法和属性来访问和修改数组,或者下标语法。 还可以使用数组的只读属性 count 来获取数组中的数据项数量。
1. println("The shopping list contains \(shoppingList.count) items.")
2. // 打印出"The shopping list contains 2 items."(这个数组有 2个项)
使用布尔项 isEmpty 来作为检查 count 属性的值是否为 0 的捷径。
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不是空的)
也可以使用 append 方法在数组后面添加新的数据项:
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"
注意第一项在数组中的索引值是 0 而不是 1。 Swift 中的数组索引总是从零开始。
我们也可以用下标来改变某个已有索引值对应的数据值:
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,因为数组都是零起索引。
调用数组的 insert(atIndex:)方法来在某个具体索引值之前添加数据项:
1. shoppingList.insert("Maple Syrup", atIndex: 0)
2. // shoppingList 现在有 7项
3. // "Maple Syrup" 现在是这个列表中的第一项
这次 insert 函数调用把值为"Maple Syrup"的新数据项插入 shopping 列表的最开始位置,并且使用 0 作为索引值。
类似的我们可以使用 removeAtIndex 方法来移除数组中的某一项。这个方法把数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项(我们不需要的时候就可以无视它):
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" 字符串
数组使用有序列表存储相同类型的多重数据。相同的值可以多次出现在一个数组的不同位置中。
Swift 数组对存储数据有具体要求。不同于 Objective-C 的 NSArray 和 NSMutableArray类,他们可以存储任何类型的实例而且不提供他们返回对象的任何本质信息。在 Swift 中,数据值在被存储进入某个数组之前类型必须明确,方法是通过显式的类型标注或类型推断,而且不是必须是 class 类型。例如: 如果我们创建了一个 Int 值类型的数组,我们不能往其中插入任何不是 Int 类型的数据。 Swift 中的数组是类型安全的,并且它们中包含的类型必须明确。
写 Swift 数组应该遵循像 Array<SomeType>这样的形式,其中 sometype 是这个数组中唯一允许存在的数据类型。 我们也可以使用像 SomeType[]这样的简单语法。 尽管两种形式在功能上是一样的, 但是我们推荐较短的那种,而且在本文中都会使用这种形式来使用数组。
数组构造语句
我们可以使用字面语句来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。字面语句是一系列由逗号分割并由方括号包含的数值。 [value 1, value 2, value 3]。
下面这个例子创建了一个叫做 shoppingList 并且存储字符串的数组:
1. var shoppingList: String[] = ["Eggs", "Milk"]
2. // shoppingList 已经被构造并且拥有两个初始项。
shoppingList 变量被声明为“字符串值类型的数组“,记作 String[]。 因为这个数组被规定只有 String 一种数据结构,所以只有 String 类型可以在其中被存取。 在这里,shoppinglist数组由两个 String 值("Eggs" 和"Milk")构造,并且由字面语句定义。
注意: Shoppinglist 数组被声明为变量(var 关键字创建)而不是常量(let 创建)是因为以后可能会有更多的数据项被插入其中。 由 于 Swift 的类型推断机制,当我们用字面语句构造只拥有相同类型值数组的时候,我们不必把数组的类型定义清楚。 shoppinglist 的构造也可以这样写:
1. var shoppingList = ["Eggs", "Milk"]
因为所有字面语句中的值都是相同的类型, Swift 可以推断出 String[]是 shoppinglist 中变量的正确类型。
我们可以通过数组的方法和属性来访问和修改数组,或者下标语法。 还可以使用数组的只读属性 count 来获取数组中的数据项数量。
1. println("The shopping list contains \(shoppingList.count) items.")
2. // 打印出"The shopping list contains 2 items."(这个数组有 2个项)
使用布尔项 isEmpty 来作为检查 count 属性的值是否为 0 的捷径。
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不是空的)
也可以使用 append 方法在数组后面添加新的数据项:
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"
注意第一项在数组中的索引值是 0 而不是 1。 Swift 中的数组索引总是从零开始。
我们也可以用下标来改变某个已有索引值对应的数据值:
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,因为数组都是零起索引。
调用数组的 insert(atIndex:)方法来在某个具体索引值之前添加数据项:
1. shoppingList.insert("Maple Syrup", atIndex: 0)
2. // shoppingList 现在有 7项
3. // "Maple Syrup" 现在是这个列表中的第一项
这次 insert 函数调用把值为"Maple Syrup"的新数据项插入 shopping 列表的最开始位置,并且使用 0 作为索引值。
类似的我们可以使用 removeAtIndex 方法来移除数组中的某一项。这个方法把数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项(我们不需要的时候就可以无视它):
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" 字符串