-1

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

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

这意味着如果我更改 endIdx 值,stride 函数将被忽略。有没有办法解决这个问题,使用 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]
4

1 回答 1

2

方法stride...

返回值的序列(self、self + stride、self + stride + stride、... last),其中 last 是小于或等于 end 的进程中的最后一个值。

所以,正如你所指出的,当你调用stride这里

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

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

解决方案

让我们看一下您要执行的逻辑。也许我们可以找到更好的实现。

如果我错了,请纠正。

你想输入一个整数lastNum

如果 lastNum > 6 那么输出 8,7

其他输出 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 中仍然完全可用。然而,使用 a 构建一个值(在这种情况下是一个数组)for in确实迫使我们使用可变值命令式代码。我们应该尽可能避免这两种情况,因为不可变值更安全,声明式代码更清晰,可能更快。

于 2016-03-27T21:33:24.843 回答