在 Swift 中,Sequence 是一个协议,表示可以被逐一遍历的有序集合。一个符合 Sequence 协议的类型可以使用 for-in 循环迭代其所有元素。
Sequence 是 Swift 集合类型(如数组、字典、集合等)的基础协议,许多高级功能如 map、filter、reduce 都依赖于它。
Sequence 的核心定义
protocol Sequence {
associatedtype Element
func makeIterator() -> Iterator
}
1、Element
表示序列中元素的类型。
2、makeIterator()
返回一个迭代器对象,该对象遵循 IteratorProtocol 协议,并提供逐一访问元素的功能。
IteratorProtocol
迭代器协议提供访问序列元素的核心方法:
protocol IteratorProtocol {
associatedtype Element
mutating func next() -> Element?
}
next()
每次调用时返回序列的下一个元素;如果没有更多元素可用,则返回 nil。
常见的 Sequence 类型
许多 Swift 标准库类型都符合 Sequence 协议,例如:
Array:一个有序的集合。
Set:一个无序、唯一的集合。
Dictionary:键值对集合。
Range:连续的整数范围。
String:一个字符序列。
例子:
let array = [1, 2, 3, 4]
for number in array {
print(number) // 输出:1 2 3 4
}
let range = 1...5
for number in range {
print(number) // 输出:1 2 3 4 5
}
常用的 Sequence 方法
Swift 为所有符合 Sequence 的类型提供了许多高阶函数和方法:
1、Iteration
let names = ["Alice", "Bob", "Charlie"]
for name in names {
print(name)
}
2、map(_:)
将序列的每个元素转换为另一种形式,并返回新序列:
let numbers = [1, 2, 3]
let squares = numbers.map { $0 * $0 }
print(squares) // 输出:[1, 4, 9]
3、filter(_:)
过滤序列中的元素:
let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // 输出:[2, 4]
4、reduce(_:_:)
将序列中的所有元素组合成一个值:
let numbers = [1, 2, 3, 4]
let sum = numbers.reduce(0, +)
print(sum) // 输出:10
5、forEach(_:)
对序列的每个元素执行操作:
let names = ["Alice", "Bob", "Charlie"]
names.forEach { print($0) }
自定义 Sequence
可以创建自己的类型并使其符合 Sequence 协议,只需要实现 makeIterator() 方法,并返回一个符合 IteratorProtocol 的迭代器。
例子:自定义数字序列
struct NumberSequence: Sequence {
let numbers: [Int]
func makeIterator() -> Array<Int>.Iterator {
return numbers.makeIterator()
}
}
let mySequence = NumberSequence(numbers: [1, 2, 3])
for num in mySequence {
print(num) // 输出:1 2 3
}
更复杂的例子:无限序列
struct InfiniteSequence: Sequence {
func makeIterator() -> some IteratorProtocol {
var current = 1
return AnyIterator {
defer { current += 1 }
return current
}
}
}
let infiniteSequence = InfiniteSequence()
for number in infiniteSequence.prefix(5) {
print(number) // 输出:1 2 3 4 5
}
Sequence 与 Collection 的关系
Sequence:提供一次性遍历所有元素的能力。
例如,一个生成器或流(Generator)只能前进,无法倒退或索引。
Collection:继承自 Sequence,提供更丰富的功能,如索引、计数、随机访问等。
总结
Sequence 是 Swift 中一种核心协议,用于描述可以逐一访问其元素的有序集合。它为许多集合类型和操作提供了统一接口,是 Swift 函数式编程风格的重要基础。