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