Sequence
声明
protocol Sequence<Element>
概述
序列是一个值列表,您可以一次通过一个值。迭代序列元素的最常见方法是使用 for
- in
循环:
let oneTwoThree = 1...3
for number in oneTwoThree {
print(number)
}
// Prints "1"
// Prints "2"
// Prints "3"
虽然看似简单,但此函数使您可以访问可以在任何序列上执行的大量操作。例如,要检查序列是否包含特定值,您可以按顺序测试每个值,直到找到匹配项或到达序列末尾。此示例检查特定昆虫是否在数组中。
let bugs = ["Aphid", "Bumblebee", "Cicada", "Damselfly", "Earwig"]
var hasMosquito = false
for bug in bugs {
if bug == "Mosquito" {
hasMosquito = true
break
}
}
print("'bugs' has a mosquito: \(hasMosquito)")
// Prints "'bugs' has a mosquito: false"
Sequence
协议为依赖顺序访问序列值的许多常见操作提供默认实现。为了更清晰、更简洁的代码,上面的示例可以使用数组的 contains(_:)
方法,每个序列都继承自 Sequence
,而不是手动迭代:
if bugs.contains("Mosquito") {
print("Break out the bug spray.")
} else {
print("Whew, no mosquitos!")
}
// Prints "Whew, no mosquitos!"
重复访问
Sequence
协议对一致性类型没有关于它们是否会被迭代破坏性消耗的要求。因此,不要假设序列上的多个 for
- in
循环或者恢复迭代,或者从头开始:
for element in sequence {
if ... some condition { break }
}
for element in sequence {
// No defined behavior
}
在这种情况下,您不能假设一个序列是可消耗的并且将恢复迭代,或者一个序列是一个集合并将从第一个元素重新开始迭代。在第二个for
- in
循环中,允许非集合的符合序列产生任意元素序列。
要确定您创建的类型支持非破坏性迭代,请添加对Collection
协议的一致性。
符合序列协议
使您自己的自定义类型符合Sequence
可以轻松实现许多有用的操作,例如for
- in
循环和contains
方法。要将Sequence
一致性添加到您自己的自定义类型,请添加一个返回迭代器的makeIterator()
方法。
或者,如果您的类型可以充当自己的迭代器,那么实现IteratorProtocol
协议的要求并声明符合Sequence
和IteratorProtocol
就足够了。
下面是一个 Countdown
序列的定义,该序列用作它自己的迭代器。 makeIterator()
方法作为默认实现提供。
struct Countdown: Sequence, IteratorProtocol {
var count: Int
mutating func next() -> Int? {
if count == 0 {
return nil
} else {
defer { count -= 1 }
return count
}
}
}
let threeToGo = Countdown(count: 3)
for i in threeToGo {
print(i)
}
// Prints "3"
// Prints "2"
// Prints "1"
预期表现
一个序列应该在 O(1) 中提供它的迭代器。 Sequence
协议对元素访问没有其他要求,因此除非另有说明,否则应将遍历序列的例程视为 O(n
)。
可用版本
相关用法
- Swift Sequence prefix(_:)用法及代码示例
- Swift Sequence prefix(while:)用法及代码示例
- Swift Sequence allSatisfy(_:)用法及代码示例
- Swift Sequence reduce(_:_:)用法及代码示例
- Swift Sequence min()用法及代码示例
- Swift Sequence reduce(into:_:)用法及代码示例
- Swift Sequence filter(_:)用法及代码示例
- Swift Sequence shuffled(using:)用法及代码示例
- Swift Sequence sorted(by:)用法及代码示例
- Swift Sequence contains(_:)用法及代码示例
- Swift Sequence max(by:)用法及代码示例
- Swift Sequence split(separator:maxSplits:omittingEmptySubsequences:)用法及代码示例
- Swift Sequence elementsEqual(_:)用法及代码示例
- Swift Sequence enumerated()用法及代码示例
- Swift Sequence sorted()用法及代码示例
- Swift Sequence contains(where:)用法及代码示例
- Swift Sequence dropLast(_:)用法及代码示例
- Swift Sequence suffix(_:)用法及代码示例
- Swift Sequence dropFirst(_:)用法及代码示例
- Swift Sequence compactMap(_:)用法及代码示例
- Swift Sequence map(_:)用法及代码示例
- Swift Sequence forEach(_:)用法及代码示例
- Swift Sequence flatMap(_:)用法及代码示例
- Swift Sequence shuffled()用法及代码示例
- Swift Sequence split(maxSplits:omittingEmptySubsequences:whereSeparator:)用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Sequence。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。