You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中stride(from:to:by:)与stride(from:through:by:)的区别

Swift中stride(from:to:by:)与stride(from:through:by:)的核心差异解析

刚上手Swift控制流的时候,真的很容易把这两个stride函数搞混——毕竟名字和基础功能太相似了!其实二者的核心区别就在于是否包含指定的结束值,下面结合你给出的例子详细拆解:

1. stride(from:to:by:):半开区间迭代,不包含结束值

这个函数的逻辑是「从起始值开始,按指定步长递增/递减,直到小于结束值时停止」,属于半开区间([起始值, 结束值))的迭代,永远不会包含结束值本身。

看你提供的示例代码:

let minutes = 60
let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // 每5分钟渲染一个刻度(0, 5, 10, 15 ... 45, 50, 55)
}

这里结束值是60,当迭代到55时,下一个步长加5会等于60,刚好触碰到结束值的边界,所以迭代就停在55,不会把60纳入结果里——完美对应“分钟刻度到55为止,不包含60”的需求。

2. stride(from:through:by:):闭区间迭代,包含结束值(若可达)

这个函数的逻辑是「从起始值开始,按指定步长递增/递减,直到小于等于结束值时停止」,属于闭区间([起始值, 结束值])的迭代,只要步长能让起始值经过整数次累加/累减后刚好等于结束值,就会把它包含在结果里。

再看你的小时刻度示例:

let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
    // 每3小时渲染一个刻度(3, 6, 9, 12)
}

起始值是3,步长3,经过3次累加后刚好等于结束值12,所以迭代会把12也纳入结果,符合时钟“到12点为止”的需求。

补充:如果步长无法到达结束值(比如把hourInterval改成4,结束值还是12),迭代会停在小于结束值的最后一个符合步长的元素,结果会是[3,7,11],因为11+4=15>12,无法到达结束值,所以不会包含12。

核心差异对比

特性stride(from:to:by:)stride(from:through:by:)
区间类型半开区间 [start, end)闭区间 [start, end]
是否包含结束值永远不包含,即使步长可达步长可达则包含,否则不包含
常见适用场景迭代到上限值前停止(如分钟刻度)需要包含上限值的迭代(如时钟整点)

内容的提问来源于stack exchange,提问作者Gaurang Chokhariya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:14:09