在 Swift 中,Array 是一个常用的数据结构,提供了很多强大的接口(方法和属性)来管理、操作和查询数组。以下是常用接口的分类和对应的说明,涵盖 remove, first 等常见的操作以及其它你可能感兴趣的功能。
1. 数组基本信息#
| 属性或方法 | 功能说明 | 示例 |
|---|---|---|
first | 返回数组的第一个元素(可选类型,如果数组为空则返回 nil)。 | let firstItem = array.first |
last | 返回数组的最后一个元素(可选类型,如果数组为空则返回 nil)。 | let lastItem = array.last |
count | 返回数组中元素的数量。 | print(array.count) |
isEmpty | 返回一个布尔值,指示数组是否为空。 | if array.isEmpty { print("Empty") } |
2. 元素的添加#
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
append(_:) | 在数组末尾追加一个元素。 | array.append(5) |
insert(_:at:) | 在指定位置插入一个元素,其他元素会向后移动。 | array.insert(2, at: 1) |
append(contentsOf:) | 将一个数组的内容追加到当前数组中。 | array.append(contentsOf: [3, 4, 5]) |
3. 元素的移除#
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
remove(at:) | 移除指定索引位置的元素,并返回该元素。如果索引越界会崩溃。 | array.remove(at: 2) |
removeFirst() | 移除数组的第一个元素,如果为空则崩溃。 | array.removeFirst() |
removeLast() | 移除数组的最后一个元素,如果为空则崩溃。 | array.removeLast() |
removeFirst(_:) | 从头部开始移除指定数量的元素,数组必须包含足够多的元素。 | array.removeFirst(2) |
removeLast(_:) | 从尾部开始移除指定数量的元素,数组必须包含足够多的元素。 | array.removeLast(1) |
removeAll() | 移除所有元素,保持数组为空。 | array.removeAll() |
removeAll(where:) | 移除满足条件的所有元素。 | array.removeAll(where: { $0 > 3 }) |
popLast() | 移除并返回最后一个元素。如果数组为空,则返回 nil。 | let lastItem = array.popLast() |
4. 元素访问#
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
subscript(_:) | 通过索引获取或设置指定位置的元素,索引越界会崩溃。 | let item = array[1]; array[1] = 10 |
first(where:) | 返回第一个满足条件的元素(可选类型),没有则返回 nil。 | let item = array.first(where: { $0 > 3 }) |
last(where:) | 返回最后一个满足条件的元素(可选类型),没有则返回 nil。 | let item = array.last(where: { $0 < 5 }) |
contains(_:) | 检查数组是否包含指定的元素。 | if array.contains(2) { print("Found") } |
contains(where:) | 检查数组是否有任何元素满足条件。 | let result = array.contains(where: { $0 > 0 }) |
index(of:) | 获取指定元素的第一个索引(可选类型),找不到返回 nil。 | let index = array.index(of: 3) |
index(where:) | 获取满足条件的第一个索引(可选类型),找不到返回 nil。 | let index = array.index(where: { $0 > 5 }) |
5. 数组变换#
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
map(_:) | 将数组中的每个元素通过闭包转换生成一个新的数组。 | let result = array.map { $0 * 2 } |
filter(_:) | 通过闭包过滤数组,生成仅包含满足条件的元素的新数组。 | let result = array.filter { $0 > 2 } |
reduce(_:_:) | 将数组的所有元素组合计算成一个值。 | let sum = array.reduce(0) { $0 + $1 } |
compactMap(_:) | 转换数组元素并剔除 nil 值,生成新数组。 | let result = array.compactMap { Int($0) } |
flatMap(_:) | 将嵌套数组展平为单层数组并转换。 | let result = array.flatMap { $0 } |
6. 排序与重排#
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
sorted() | 返回升序排序的新数组(要求数组元素遵循 Comparable 协议)。 | let result = array.sorted() |
sorted(by:) | 返回使用指定闭包条件排序的新数组。 | let result = array.sorted(by: >) |
sort() | 原地对数组排序,修改自身,按升序排列。 | array.sort() |
sort(by:) | 原地对数组按指定闭包条件排序,修改自身。 | array.sort(by: >) |
reverse() | 将数组顺序倒置,修改自身。 | array.reverse() |
shuffled() | 返回数组的随机排列版本的新数组。 | let result = array.shuffled() |
shuffle() | 原地将数组随机排列,修改自身。 | array.shuffle() |
7. 分组与分割#
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
prefix(_:) | 获取从数组前面开始指定数量的元素。 | let firstTwo = array.prefix(2) |
suffix(_:) | 获取从数组后面开始指定数量的元素。 | let lastTwo = array.suffix(2) |
split(separator:) | 根据指定值分割数组,返回一个子数组集合。 | let parts = array.split(separator: 3) |
chunked(by:) (扩展) | 将数组按指定大小分割成更小子数组的集合。 (需要手动实现) | let chunks = array.chunked(by: 3) |
8. 集合操作#
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
union(_:) (Set类型) | 返回两个集合的并集(去重)。 | let result = array.union(otherArray) |
intersection(_:) (Set) | 返回两个集合的交集。 | let result = array.intersection(otherArray) |
difference(_:) (Set) | 返回当前集合的差集。 | let result = array.subtracting(otherArray) |
9. 类型检查#
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
allSatisfy(_:) | 检查数组中的所有元素是否满足条件。 | let result = array.allSatisfy { $0 > 0 } |
contains(where:) | 检查数组中是否有一个元素满足特定条件。 | let result = array.contains(where: { $0 > 3 }) |
10. Equatable & Hashable 支持#
- 如果数组的元素符合
Equatable协议,支持以下接口:
| 方法名称 | 功能说明 | 示例 |
|---|---|---|
== | 检查两个数组内容是否相等。 | if array1 == array2 { print("Equal") } |
index(of:) | 获取指定元素的索引位置,如果不存在则返回 nil。 | let idx = array.index(of: 5) |
常用示例操作#
Swift 中的数组(Array)是一种有序的集合,用于存储同一类型的值。数组本身是值类型,但 Swift 采用“写时复制”优化,因此传递和修改数组时性能表现非常高效。下面我们详细介绍 Swift 数组的基本使用方法和常见操作,并附上代码示例:
1. 数组的创建#
1.1 创建空数组#
可以使用类型推断或显式声明类型来创建空数组:
var numbers = [Int]() // 空的 Int 数组,类型推断为 [Int]
var names: [String] = [] // 显式声明空的 String 数组1.2 创建并初始化数组#
直接用字面量初始化数组:
let fruits = ["Apple", "Banana", "Orange"]
let scores: [Double] = [95.5, 88.0, 76.5]2. 访问数组元素#
2.1 通过下标访问#
数组的索引从 0 开始,可以通过下标来读取或修改元素:
var fruits = ["Apple", "Banana", "Orange"]
print(fruits[0]) // 输出 "Apple"
fruits[1] = "Grape"
print(fruits) // ["Apple", "Grape", "Orange"]2.2 安全访问#
使用 first、last 属性或可选下标防止数组越界:
if let firstFruit = fruits.first {
print("第一个水果:\(firstFruit)")
}3. 修改数组#
3.1 添加元素#
使用 append 方法或 += 运算符来添加元素:
var numbers = [1, 2, 3]
numbers.append(4) // [1, 2, 3, 4]
numbers += [5, 6] // [1, 2, 3, 4, 5, 6]3.2 插入元素#
使用 insert(_:at:) 在指定位置插入元素:
numbers.insert(0, at: 0) // 在数组开头插入 0 -> [0, 1, 2, 3, 4, 5, 6]3.3 删除元素#
常用方法包括 remove(at:)、removeFirst()、removeLast() 和 removeAll():
let removed = numbers.remove(at: 3) // 移除索引 3 的元素,返回被移除的值
numbers.removeFirst() // 移除第一个元素
numbers.removeLast() // 移除最后一个元素4. 遍历数组#
4.1 for-in 循环#
for fruit in fruits {
print(fruit)
}4.2 使用 enumerated() 获取索引和值#
for (index, fruit) in fruits.enumerated() {
print("索引 \(index): \(fruit)")
}5. 数组的其他常用功能#
- 判断是否为空:
isEmpty属性 - 获取元素个数:
count属性 - 查找元素:
contains(_:)方法或firstIndex(of:)方法 - 排序:使用
sorted()或sort()方法
if !fruits.isEmpty {
print("水果总数:\(fruits.count)")
}
if fruits.contains("Apple") {
print("数组中包含 Apple")
}
if let index = fruits.firstIndex(of: "Orange") {
print("Orange 的索引是 \(index)")
}
let sortedFruits = fruits.sorted()6. 值类型与写时复制(Copy-on-Write)#
虽然数组是值类型,但 Swift 使用写时复制机制,使得当你将数组赋值给另一个变量或传递到函数中时,只有在修改时才会真正复制数据,从而保持高效性。
7. 其他示例#
移除重复元素
let uniqueArray = Array(Set(array))合并数组
let mergedArray = array1 + array2按条件分割数组(Chunk)
extension Array { func chunked(by size: Int) -> [[Element]] { stride(from: 0, to: count, by: size).map { Array(self[$0..<Swift.min($0 + size, count)]) } } } let chunks = array.chunked(by: 3)
总结#
Array 提供了对数组增删改查的丰富接口,常用的有:
- 元素操作(添加/删除/访问):
append,remove,insert,first,last,subscript。 - 查询与条件检查:
contains,first(where:),filter,allSatisfy等。 - 数组操作:
map,reduce,compactMap。 - 排序与遍历函数:
sorted,sort,reverse,shuffled。