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