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


Swift Strideable用法及代码示例

协议

Strideable

表示可以偏移和测量的连续的一维值的类型。

声明

protocol Strideable : Comparable

概述

您可以将符合Strideable 协议的类型与stride(from:to:by:)stride(from:through:by:) 函数一起使用。例如,您可以使用 stride(from:to:by:) 来迭代浮点值的间隔:


for radians in stride(from: 0.0, to: .pi * 2, by: .pi / 2) {
    let degrees = Int(radians * 180 / .pi)
    print("Degrees: \(degrees), radians: \(radians)")
}
// Degrees: 0, radians: 0.0
// Degrees: 90, radians: 1.5707963267949
// Degrees: 180, radians: 3.14159265358979
// Degrees: 270, radians: 4.71238898038469

这些函数的最后一个参数是关联的Stride 类型——该类型表示任意两个Strideable 类型实例之间的距离。

具有整数Stride 的类型可以用作可数范围的边界或可迭代的one-sided 范围的下限。例如,您可以遍历Int 的范围并使用序列和集合方法。


var sum = 0
for x in 1...100 {
    sum += x
}
// sum == 5050


let digits = (0..<10).map(String.init)
// ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

符合 Strideable 协议

要将Strideable 一致性添加到自定义类型,请选择可以表示两个实例之间距离的Stride 类型并实现advanced(by:)distance(to:) 方法。例如,这个假设的 Date 类型将其值存储为 2000 年 1 月 1 日之前或之后的天数:


struct Date: Equatable, CustomStringConvertible {
    var daysAfterY2K: Int


    var description: String {
        // ...
    }
}

DateStride 类型是 Int ,从 advanced(by:)distance(to:) 的参数和返回类型推断:


extension Date: Strideable {
    func advanced(by n: Int) -> Date {
        var result = self
        result.daysAfterY2K += n
        return result
    }


    func distance(to other: Date) -> Int {
        return other.daysAfterY2K - self.daysAfterY2K
    }
}

Date 类型现在可以与 stride(from:to:by:)stride(from:through:by:) 函数一起使用,并作为可迭代范围的边界。


let startDate = Date(daysAfterY2K: 0)   // January 1, 2000
let endDate = Date(daysAfterY2K: 15)    // January 16, 2000


for date in stride(from: startDate, to: endDate, by: 7) {
    print(date)
}
// January 1, 2000
// January 8, 2000
// January 15, 2000

可用版本

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

相关用法


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