数组 #

一、数组概述 #

数组是Swift中最常用的集合类型,用于存储有序的相同类型元素。

1.1 数组特点 #

  • 有序集合
  • 元素类型相同
  • 支持索引访问
  • 值类型(复制时创建副本)

二、创建数组 #

2.1 空数组 #

swift
var emptyArray: [Int] = []
var emptyArray2 = [Int]()
var emptyArray3 = Array<Int>()

print(emptyArray.isEmpty)

2.2 带初始值 #

swift
let numbers = [1, 2, 3, 4, 5]
let strings = ["A", "B", "C"]
let doubles: [Double] = [1.0, 2.0, 3.0]

print(numbers)
print(strings)
print(doubles)

2.3 重复值初始化 #

swift
let zeros = Array(repeating: 0, count: 5)
let hellos = Array(repeating: "Hello", count: 3)

print(zeros)
print(hellos)

2.4 数组字面量 #

swift
let fruits: [String] = ["苹果", "香蕉", "橙子"]
let mixed: [Any] = [1, "Hello", 3.14, true]

print(fruits)
print(mixed)

三、访问元素 #

3.1 通过索引访问 #

swift
let fruits = ["苹果", "香蕉", "橙子"]

print(fruits[0])
print(fruits[1])
print(fruits[2])

3.2 安全访问 #

swift
let fruits = ["苹果", "香蕉", "橙子"]

if let first = fruits.first {
    print(first)
}

if let last = fruits.last {
    print(last)
}

let index = 5
if index < fruits.count {
    print(fruits[index])
}

3.3 获取子数组 #

swift
let numbers = [1, 2, 3, 4, 5]

let firstThree = numbers[0..<3]
let lastTwo = numbers[3...]
let middle = numbers[1...3]

print(firstThree)
print(lastTwo)
print(middle)

3.4 数组属性 #

swift
let numbers = [1, 2, 3, 4, 5]

print(numbers.count)
print(numbers.isEmpty)
print(numbers.first!)
print(numbers.last!)

四、修改数组 #

4.1 添加元素 #

swift
var fruits = ["苹果", "香蕉"]

fruits.append("橙子")
print(fruits)

fruits += ["葡萄", "西瓜"]
print(fruits)

fruits.insert("草莓", at: 1)
print(fruits)

4.2 删除元素 #

swift
var fruits = ["苹果", "香蕉", "橙子", "葡萄"]

let removed = fruits.remove(at: 1)
print(removed)
print(fruits)

let lastRemoved = fruits.removeLast()
print(lastRemoved)
print(fruits)

let firstRemoved = fruits.removeFirst()
print(firstRemoved)
print(fruits)

fruits.removeAll()
print(fruits)

4.3 修改元素 #

swift
var fruits = ["苹果", "香蕉", "橙子"]

fruits[0] = "红苹果"
print(fruits)

fruits[1...2] = ["黄香蕉", "甜橙子"]
print(fruits)

4.4 替换元素 #

swift
var fruits = ["苹果", "香蕉", "橙子"]

fruits.replaceSubrange(0...1, with: ["草莓", "蓝莓"])
print(fruits)

五、遍历数组 #

5.1 for-in遍历 #

swift
let fruits = ["苹果", "香蕉", "橙子"]

for fruit in fruits {
    print(fruit)
}

5.2 带索引遍历 #

swift
let fruits = ["苹果", "香蕉", "橙子"]

for (index, fruit) in fruits.enumerated() {
    print("\(index): \(fruit)")
}

5.3 反向遍历 #

swift
let fruits = ["苹果", "香蕉", "橙子"]

for fruit in fruits.reversed() {
    print(fruit)
}

5.4 while遍历 #

swift
let fruits = ["苹果", "香蕉", "橙子"]
var index = 0

while index < fruits.count {
    print(fruits[index])
    index += 1
}

六、数组操作 #

6.1 查找元素 #

swift
let numbers = [1, 2, 3, 4, 5, 3]

print(numbers.contains(3))
print(numbers.firstIndex(of: 3) ?? -1)
print(numbers.lastIndex(of: 3) ?? -1)

let firstEven = numbers.first { $0 % 2 == 0 }
print(firstEven ?? 0)

6.2 过滤 #

swift
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)

let greaterThanFive = numbers.filter { $0 > 5 }
print(greaterThanFive)

6.3 映射 #

swift
let numbers = [1, 2, 3, 4, 5]

let doubled = numbers.map { $0 * 2 }
print(doubled)

let strings = numbers.map { "数字\($0)" }
print(strings)

6.4 归约 #

swift
let numbers = [1, 2, 3, 4, 5]

let sum = numbers.reduce(0, +)
print(sum)

let product = numbers.reduce(1, *)
print(product)

let concatenated = numbers.reduce("") { $0 + "\($1)" }
print(concatenated)

6.5 排序 #

swift
var numbers = [3, 1, 4, 1, 5, 9, 2, 6]

let sorted = numbers.sorted()
print(sorted)

let descending = numbers.sorted { $0 > $1 }
print(descending)

numbers.sort()
print(numbers)

七、数组比较 #

7.1 相等比较 #

swift
let a = [1, 2, 3]
let b = [1, 2, 3]
let c = [3, 2, 1]

print(a == b)
print(a == c)

7.2 查找差异 #

swift
let a = [1, 2, 3, 4]
let b = [3, 4, 5, 6]

let onlyInA = a.filter { !b.contains($0) }
let onlyInB = b.filter { !a.contains($0) }
let inBoth = a.filter { b.contains($0) }

print("只在A中: \(onlyInA)")
print("只在B中: \(onlyInB)")
print("在两者中: \(inBoth)")

八、多维数组 #

8.1 二维数组 #

swift
var matrix: [[Int]] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

print(matrix[0][0])
print(matrix[1][2])

matrix[0][0] = 10
print(matrix)

8.2 初始化二维数组 #

swift
let rows = 3
let cols = 4
var grid = Array(repeating: Array(repeating: 0, count: cols), count: rows)

print(grid)

grid[1][2] = 5
print(grid)

8.3 遍历二维数组 #

swift
let matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

for row in matrix {
    for element in row {
        print(element, terminator: " ")
    }
    print()
}

九、实际应用 #

9.1 数组去重 #

swift
let numbers = [1, 2, 2, 3, 3, 3, 4, 4, 5]
let unique = Array(Set(numbers))
print(unique)

let orderedUnique = numbers.reduce(into: [Int]()) { result, value in
    if !result.contains(value) {
        result.append(value)
    }
}
print(orderedUnique)

9.2 数组分块 #

swift
extension Array {
    func chunked(into size: Int) -> [[Element]] {
        guard size > 0 else { return [] }
        return stride(from: 0, to: count, by: size).map {
            Array(self[$0..<Swift.min($0 + size, count)])
        }
    }
}

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let chunks = numbers.chunked(into: 3)
print(chunks)

9.3 数组扁平化 #

swift
let nested = [[1, 2], [3, 4], [5, 6]]
let flattened = nested.flatMap { $0 }
print(flattened)

let optionalNumbers: [Int?] = [1, nil, 3, nil, 5]
let compacted = optionalNumbers.compactMap { $0 }
print(compacted)

9.4 数组分组 #

swift
let students = [
    ("张三", 85),
    ("李四", 90),
    ("王五", 75),
    ("赵六", 85)
]

let grouped = Dictionary(grouping: students) { $0.1 }
for (score, students) in grouped {
    print("\(score)分: \(students.map { $0.0 })")
}

十、总结 #

本章学习了Swift数组:

  • 创建:字面量、初始化器
  • 访问:索引、first/last
  • 修改:append、insert、remove
  • 操作:filter、map、reduce、sorted

最佳实践:

  • 使用高阶函数简化代码
  • 注意索引越界问题
  • 合理使用compactMap和flatMap
  • 使用扩展添加实用方法

下一章,我们将学习字典!

最后更新:2026-03-26