注:Swift的Array类型被桥接到Foundation中的NSArray类。
数组的简单语法
Swift中数组的完整写法为Array<Element>,其中Element是这个数组中唯一允许存在的数据类型。也可以使用像[Element]这样的简单语法。尽管两种形式在功能上是一样的,但是推荐较短的那种,而且在本文中都会使用这种形式来使用数组。
创建一个空数组
你可以使用构造语法来创建一个由特定数据类型构成的空数组。
var someInts = [Int]() print("someInts is of type [Int] with \(someInts.count) items.") //打印“someInts is of type [Int] with 0 items.”
注意,通过构造函数的类型,someInts 的值类型被推断为 [Int]。
或者,如果代码上下文中已经提供了类型信息,例如一个函数参数或者一个已经定义好类型的常量或者变量,你可以使用空数组语句创建一个空数组,它的写法很简单:[](一对空方括号)。
someInts.append(3) //someInts现在包含一个Int值 someInts = [ ] //someInts现在是空数组,但是仍然是[Int]类型的。
创建一个带有默认值的数组
Swift 中的 Array 类型还提供一个可以创建特定大小并且所有数据都被默认的构造方法。可以把准备加入新数组的数据项数量(count)和适当类型的初始值(repeating)传入数组构造函数。
var threeDoubles = Array(repeating:0.0,count:3) //threeDoubles 是一种 [Double] 数组,等价于 [0.0, 0.0, 0.0]
通过两个数组相加创建一个数组
你可以使用加法操作符(+)来组合两个已存在的相同类型数组。新数组的数据类型会从两个数组的数据类型中推断出来。
var anotherThreeDoubles = Array(repeating:2.5,count:3) //anotherThreeDoubles被推断为[Double],等价于[2.5,2.5,2.5] var sixDoubles = threeDoubles + anotherThreeDoubles //sixDoubles被推断为[Double],等价于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
用数组字面量构造数组
你可以使用数组字面量来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。数组字面量是一系列由逗号分隔并由方括号包含的数值。
[value 1,value 2,value 3]
下面这个例子创建了一个叫做shoppingList并且存储String的数组。
var shoppingList:[String] = ["Eggs","Milk"] //shoppingList已经被构造并且拥有两个初始项
shoppingList变量被声明为“字符串值类型的数组”,记作[String]。因为这个数组被规定只有String一种数据结构,所以只有String类型可以在其中被存取。在这里,shoppingList 数组由两个 String 值("Eggs" 和 "Milk")构造,并且由数组字面量定义。
注:shoppingList数组被声明为变量(var关键字创建)而不是常量(let创建)是因为之后会有更多的数据项被插入其中。
在这个例子中,字面量仅仅包含两个String值。匹配了该数组的声明(只能包含String的数组),所以可以将这个字面量的赋值过程看作用两个初始项来构造shoppingList的一种方式。
由于Swift的类型推断机制,当你用字面量构造拥有相同类型值数组的时候,不必把数组的类型定义清楚。shoppingList的构造也可以这样写。
var shoppingList = ["Eggs","Milk"]
访问和修改数组
你可以通过数组的方法和属性来访问和修改数组,或者使用下标语法。
可以使用数组的只读属性count来获取数组中的数据项数量。
print("The shopping list coutains \(shoppingList.count) items.") //输出“The shopping list contains 2 items.”(这个数组有2个项)
使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0。
if shoppingList.isEmpty { print("The shopping list is empty.") }else{ print("The shopping list is not empty.") } //打印“The shopping list is not empty.”(shoppinglist 不是空的)
也可以使用append(_:)方法在数组后面添加新的数据项。
shoppingList.append("Flour") //shoppingList现在有3个数据项
除此之外,也可以使用加法赋值运算符(+=)直接将另一个相同类型数组中的数据添加到该数组后面。
shoppingList += ["Baking Powder"] //shoppingList现在有四项了 shoppingList += ["Chocolate Spread","Cheese","Butter"] //shoppingList现在有七项了
可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的。下面的例子把"Chocolate Spread"、"Cheese"和"Butter"替换为"Bananas"和"Apples"。
shoppingList[4...6] = ["Bananas","Apples"] //shoppingList现在有6项
通过调用数组的insert(_:at:)方法在某个指定索引值之前添加数据项。
shoppingList.insert("Maple Syrup",at:0) //shoppingList现在有7项 //现在这个列表中的第一项是“Maple Syrup”
类似的可以使用remove(at:)方法来移除数组中的某一项。这个方法把数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项(不需要的时候就可以无视它)。
let mapleSyrup = shoppingList.remove(at:0) //索引值为0的数据项被移除 //shoppingList现在只有6项,而且不包括Maple Syrup //mapleSyrup常量的值等于被移除数据项“Maple Syrup”
如果你只想把数组中的最后一项移除,可以使用removeLast()方法而不是remove(at:)方法来避免需要获取数组的count属性。就像后者一样,前者也会返回被移除的数据项。
let apples = shoppingList.removeLast() //数组的最后一项被移除了 //shoppingList现在只有5项,不包括Apples //apples常量的值现在等于字符串“Apples”
数组的遍历
你可以使用for-in循环来遍历数组中所有的数据项。
for item in shoppingList { print(item) } //Six eggs //Milk //Flour //Baking Powder //Bananas
如果同时需要每个数据项的值和索引值,可以使用enumerated()方法来进行数组遍历。enumerated()返回一个由索引值和数据值组成的元组数组。索引值从0开始,并且每次增加1;如果枚举整个数组,索引值将会和数据值一一匹配。你可以把这个元组分解成临时常量或者变量来进行遍历。
for (index,value) in shoppingList.enumerated() { print("Item \(String(index + 1)): \(value)") } //Item 1:Six eggs //Item 2:Milk //Item 3:Flour //Item 4:Baking Powder //Item 5:Bananas
数组的基本用法:
var numbers = [1,2,3,4,5] var vowels = ["A","E","I","O","U"] var emptyArray = [Int]() // 数组长度 vowels.count // 判空 numbers.isEmpty emptyArray3.isEmpty // 获取第一个元素和最后一个元素,返回的是可选型 vowels[0] vowels.first vowels.last emptyArray3.first if let firstVowel = vowels.first { print("The first vowel is " + firstVowel) } vowels.first! vowels[vowels.count - 1] // 获取最小,最大值 numbers.min() numbers.max() // 使用范围 numbers[2..<4] numbers[2..<numbers.count] // 包含 vowels.contains("A") vowels.contains("B") let letter = "A" if vowels.contains(letter) { print("\(letter) is a vowel") } else { print("\(letter) is not a vowel") } vowels.firstIndex(of: "E") vowels.firstIndex(of: "F") if let index = vowels.firstIndex(of: "E") { print("E is a vowel in position \(index+1).") } else { print("E is not a vowel.") } for index in 0..<numbers.count { numbers[index] } for number in numbers { print(number) } for (i,vowel) in vowels.enumerated() { print("\(i+1):\(vowel)") } var oneToFive = [1,2,3,4,5] numbers == oneToFive // 返回true var oneToFive2 = [1,2,4,3,5] numbers == oneToFive2 // 返回false
二维数组:
var board: Array<Array<Int>> = [ [1024, 16, 2, 0], [256, 4, 2, 0], [64, 2, 0, 0], [2, 0, 0, 0] ] board[0] board[0][0] board.count board[0].count board[0].append(0) board board.append([0, 0, 0, 0]) board += [[0,0,0,0]]
NSArray:
var array1: NSArray = [] var array2 = [1,2,3,4,5] as NSArray var array3: NSArray = [1,"Hello",3.0] var array4: Array<NSObject> = [1 as NSNumber,"hello" as NSString]
注:
1.removeFirst删除第一个数组
2.removeSubrange删除指定索引范围内的数组