数组作为程序中最常使用的对象之一,在任何程序语言中数组的重要性不言而喻,在Swift中也不例外。
数组是相同数据类型的元素的集合,数组中的各元素是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起, 且数组支持添加,删除,修改和遍历数组内的元素。
程序样例 - 可在Playground内编译运行
//创建数组
//西游团队的主要成员唐三藏,孙悟空,猪悟能和沙悟净。
var members: [String] = ["唐三藏", "孙悟空", "猪悟能","沙悟净"]
//访问数组内元素
print( "大师兄 \(members[1])" )
print( "师傅是 \(members.first)" )
print( "三师弟 \(members.last)" )
//修改数组
//孙悟空在三打白骨精事件后离开团队。
members.remove(at: 1)
//孙悟空在宝象国事件后又加入团队。
members.insert("孙悟空", at: 1)
//遍历数组,依次输出成员。
for (index, member) in members.enumerated() {
print( "第\(index)位团队成员 == \(member)" )
}
//数组长度
print("团队成员共 == \(members.count) 位")
//九九八十一难后,团队成员修成正果,团队解散。
members.removeAll()
//数组是否为空
print("团队解散 = \(members.isEmpty)")
程序分析
1. 创建数组
上述样例中体现创建数组的代码片段如下,其创建了一个包含4个字符串的数组。
var members: [String] = ["唐三藏", "孙悟空", "猪悟能","沙悟净"]
其实Swift中针对不同的场景提供了多种初始化的方式, 如你可以通过如下初始化语法创建一个指定数据类型的空数组:
var someStrings = [String]()
或
var someStrings: [String] = []
其中的String可根据需要替换成任意数据类型,如Int。
var someInts = [Int]()
或
var someInts: [Int] = []
Swift还提供另一种初始化方式,在新生成数组中包含指定数量且重复的值。
let fiveMonkeys = Array(repeating: "孙悟空", count: 3)
//输出 ["孙悟空", "孙悟空", "孙悟空"]"
2. 访问数组
和其他编程语言一样,Swift 也是通过下标检索数组内的元素。
var someVar = someArray[索引]
上述中的索引从0开始计数,通过索引 0 可以获取数组内的第 1 个元素,而第 2 个元素可以通过索引 1 获取,诸如此类,直到数组结束。
注意,索引的使用要注意是否超出当前数组边界,否则会导致程序崩溃。
Swift 提供了更优雅的方式来获取第一个元素(.first)和最后一个元素(.last),且其返回的是可选型值。
开头的程序样例已经展示了如何访问数组:
print( "大师兄 \(members[1])" ) // "孙悟空"
print( "师傅是 \(members.first)" ) //"唐三藏"
print( "三师弟 \(members.last)" ) // "沙悟净"
3. 修改数组
在使用数组的时候,会经常遇到需要修改数组内元素的场景。
需要向数组末端添加新的元素的时候,可以使用 append()方法或 加法赋值运算符( += )。
//初始化空数组。
var members: [String] = []
//使用append() 添加新元素。
members.append("唐三藏")
var subMembers: [String] = ["孙悟空", "猪悟能","沙悟净"]
//使用加法赋值运算符添加新元素。
members += subMembers
//也可以写为 members = members + subMembers
当向数组中指定位置插入新的元素时,可以使用方法 insert(), 而新的元素会插入在指定索引的前面。
var members: [String] = ["唐三藏", "猪悟能","沙悟净"]
//数组内容为 "唐三藏", "猪悟能","沙悟净"
members.insert("孙悟空", at: 1)
//插入新的元素后,数组内容为"唐三藏", "孙悟空", "猪悟能","沙悟净"
当然如果需要修改数组中指定索引的值,也是很容易操作的。
var members = ["唐三藏","孙悟空", "猪悟能","沙悟净"]
//六耳猕猴用偷天换日之法替换了孙悟空
members[1] = "六耳猕猴"
//这时团队成员是 ["唐三藏","六耳猕猴", "猪悟能","沙悟净"]
当需要移除目标数组内的元素时,可以使用方法removeAll()移除所有元素,也可以使用方法.remove(at: _) 移除指定索引的元素。
var members: [String] = ["唐三藏", "孙悟空", "猪悟能","沙悟净"]
//当前数组内容为"唐三藏", "孙悟空", "猪悟能","沙悟净"
//孙悟空在三打白骨精事件后离开团队。
members.remove(at: 1)
//当前数组内容为"唐三藏", "猪悟能","沙悟净"
members. removeAll()
//当前数组内容为空
4. 遍历数组
我们可以使用for-in来遍历数组。
当需要获取每个元素的索引, 这时用用导函数enumerate(), 其实这种在开头中的程序样例中已经展示了此用法。
for (index, member) in members.enumerated() {
print( "\(index) == \(member)" )
}
//运行上述程序会依次输出每个元素和索引。
//第1位团队成员 == 唐三藏
//第2位团队成员 == 孙悟空
//第3位团队成员 == 猪悟能
//第4位团队成员 == 沙悟净
5. 更多
只读属性count用来返回数组内所有元素的个数,主程序中也有count的用例。
print(members.count)
//由于当前数组内的元素是 ["唐三藏", "孙悟空", "猪悟能","沙悟净"], count会返回 4。
只读属性isEmpty用来表示当前数组是否为空。
print("团队解散 = \(members.isEmpty)")
结合上面的count属性,也可换一种写法, 不过显然使用isEmpty更优雅。
print("团队解散 = \(members.count == 0)")