Swift遍历有序集合协议Sequence
Swift遍历有序集合协议Sequence

Swift遍历有序集合协议Sequence

在 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 函数式编程风格的重要基础。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注