Swift — 数组(Array)

在 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()移除并返回最后一个元素。如果数组为空,则返回 nillet lastItem = array.popLast()

4. 元素访问 #

方法名称功能说明示例
subscript(_:)通过索引获取或设置指定位置的元素,索引越界会崩溃。let item = array[1]; array[1] = 10
first(where:)返回第一个满足条件的元素(可选类型),没有则返回 nillet item = array.first(where: { $0 > 3 })
last(where:)返回最后一个满足条件的元素(可选类型),没有则返回 nillet item = array.last(where: { $0 < 5 })
contains(_:)检查数组是否包含指定的元素。if array.contains(2) { print("Found") }
contains(where:)检查数组是否有任何元素满足条件。let result = array.contains(where: { $0 > 0 })
index(of:)获取指定元素的第一个索引(可选类型),找不到返回 nillet index = array.index(of: 3)
index(where:)获取满足条件的第一个索引(可选类型),找不到返回 nillet 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:)获取指定元素的索引位置,如果不存在则返回 nillet idx = array.index(of: 5)

常用示例操作 #

  1. 移除重复元素

    let uniqueArray = Array(Set(array))
    
  2. 合并数组

    let mergedArray = array1 + array2
    
  3. 按条件分割数组(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
本文共 1622 字,上次修改于 Jan 1, 2025