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
相关产品推荐
相关产品推荐

