Swift步幅功能,不能修改结束值

时间:2016-03-27 20:27:40

标签: swift for-loop stride

在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]

1 个答案:

答案 0 :(得分:2)

stride方法......

  

返回值的序列(self,self + stride,self + stride +   stride,... last)where last是进展中的最后一个值   等于或等于结束。

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

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

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

解决方案

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

如果我错了,请纠正。

  

您想输入整数lastNum

     

IF lastNum> 6然后输出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构建值(在本例中为数组)会强制我们使用可变值命令式代码。我们应该尽可能地避免这两种情况,因为不可变值更安全,声明性代码更清晰,可能更快。