当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


Swift Sequence用法及代码示例

协议

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 协议的要求并声明符合SequenceIteratorProtocol 就足够了。

下面是一个 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)。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Sequence。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。