Swift stride函数,不能修改结束值

Swift stride function, cannot modify end value

在 Swift 中,c 风格的 for 循环已被弃用,因此我将切换到 stride 函数。

在第一个函数中,我使用了 c 风格的 for 循环。 在第二个函数中,我使用了 stride 函数。 createNumbers 输出为 [8, 7, 6, 5, 4, 3, 2] createNumbers2 输出为 [8, 7, 6, 5, 4] 我正在尝试获得第一个输出。

这意味着如果我更改 endIdx 值,步幅函数将忽略。 有没有办法解决这个问题,使用 stride,这样 createNumbers2 也打印 3 和 2?

func createNumbers(lastNum: Int) -> [Int] {
    var endIdx = lastNum
    var answer : [Int] = []
    for var i = 8; i >= endIdx; i -= 1 {
        answer.append(i)
        if i == 6 {
            endIdx /= 2
        }
    }
    return answer
}

func createNumbers2(lastNum: Int) -> [Int] {
    var endIdx = lastNum
    var answer : [Int] = []
    for i in 8.stride(through: endIdx, by: -1) {
        answer.append(i)
        if i == 6 {
            endIdx /= 2
        }
    }
    return answer
}

print(createNumbers(4)) // [8, 7, 6, 5, 4, 3, 2]
print(createNumbers2(4)) // [8, 7, 6, 5, 4]

stride 方法...

Returns the sequence of values (self, self + stride, self + stride + stride, ... last) where last is the last value in the progression less than or equal to end.

因此,正如您所说,当您在此处调用 stride

for i in 8.stride(through: endIdx, by: -1) {

序列已生成。在此行之后更改 endIdx 不会更改 for in 将使用的序列。

解决方案

让我们看看你要执行的逻辑。也许我们可以找到更好的实现方式。

如有错误请指正

You want to input an integer lastNum

IF lastNum > 6 THEN OUTPUT 8,7

ELSE OUTPUT 8,7,... [lastNum/2]

对吗?

那你可以这样写

func numbers(lastNum: Int) -> [Int] {
    let biggest = 8
    guard lastNum <= biggest else { return [] }
    let smallest = lastNum > 6 ? lastNum : lastNum / 2
    return [Int](smallest...biggest).reverse()
}

测试

numbers(4) // [8, 7, 6, 5, 4, 3, 2]

更多测试

createNumbers(-1) == numbers(-1) // true
createNumbers(0) == numbers(0) // true
createNumbers(1) == numbers(1) // true
createNumbers(2) == numbers(2) // true
createNumbers(3) == numbers(3) // true
createNumbers(4) == numbers(4) // true
createNumbers(5) == numbers(5) // true
createNumbers(6) == numbers(6) // true
createNumbers(7) == numbers(7) // true
createNumbers(8) == numbers(8) // true
createNumbers(9) == numbers(9) // true

个人考虑

这只是我的观点。我知道 for in 构造在 Swift 中仍然完全可用。然而,使用 for in 构建值(在本例中为数组)确实迫使我们使用 可变值 命令代码 。我们应该尽可能避免这两种情况,因为不可变值更安全,声明式代码更清晰并且可能更快。