如何修复 C 风格的 for 语句已在 Swift 3 中被删除?
How to fix C-style for statement has been removed in Swift 3?
我正在将旧的 Swift 2 代码转换为 Swift 3,我在转换以下 for 循环时遇到困难
for (var nSize = merkleTree.count; nSize > 1; nSize = (nSize + 1) / 2)
{
//...
}
SO上有很多类似的问题,但我没有找到适用于我的问题的解决方案或者我不明白。
我认为下面的代码可以工作,但它出错了。
for var nSize in merkleTree.count.stride(to:1, by:(nSize+1)/2)
Use of unresolved identifier 'nSize'
我认为这不能再使用 for 来编写,但您可以使用 while
循环来完成工作:
var nSize = merkleTree.count
while nSize > 1 {
// loop body
nSize = (nSize + 1) / 2
}
我希望 stride
在这种情况下不起作用,因为正如您的错误所述,您不能使用 nSize
作为 stride
参数 - nSize
正在迭代根据范围声明的变量,因此您需要范围存在。至少这是我对错误的解释(我知道理论上你可以根据先前生成的项目生成范围,但显然 stride
不能那样工作)。
我相信您可以使用 reduce
找到一种方法来生成适当的值数组(因为我能够做到,请参阅下文,也许您可以使它更简单),或者通过实现您自己的 stride
接受一个闭包而不是一个步骤(这将允许你根据前一个计算下一个项目),但是这两种方法都比使用简单的 while 循环更复杂和晦涩,所以我个人更喜欢 while
循环。
我不太好的 reduce 实现(结果它使用数组而不是范围,因为通过查看 NSRange
我不认为你可以创建一个不按 1 步进的范围):
let merkleTree = [1,2,3,4,5,6,7,8,9]
let numberOfDivisions = Int(log2(Double(merkleTree.count))) + 1
let startValue = merkleTree.count
let nSizes = (0..<numberOfDivisions).reduce([startValue]) { (result, next) -> [Int] in
var newResult = result
newResult.append((result.last! + 1) / 2)
return newResult
}
print(nSizes)
// and now you can for-in it:
for nSize in nSizes {
// ...
}
我正在将旧的 Swift 2 代码转换为 Swift 3,我在转换以下 for 循环时遇到困难
for (var nSize = merkleTree.count; nSize > 1; nSize = (nSize + 1) / 2)
{
//...
}
SO上有很多类似的问题,但我没有找到适用于我的问题的解决方案或者我不明白。
我认为下面的代码可以工作,但它出错了。
for var nSize in merkleTree.count.stride(to:1, by:(nSize+1)/2)
Use of unresolved identifier 'nSize'
我认为这不能再使用 for 来编写,但您可以使用 while
循环来完成工作:
var nSize = merkleTree.count
while nSize > 1 {
// loop body
nSize = (nSize + 1) / 2
}
我希望 stride
在这种情况下不起作用,因为正如您的错误所述,您不能使用 nSize
作为 stride
参数 - nSize
正在迭代根据范围声明的变量,因此您需要范围存在。至少这是我对错误的解释(我知道理论上你可以根据先前生成的项目生成范围,但显然 stride
不能那样工作)。
我相信您可以使用 reduce
找到一种方法来生成适当的值数组(因为我能够做到,请参阅下文,也许您可以使它更简单),或者通过实现您自己的 stride
接受一个闭包而不是一个步骤(这将允许你根据前一个计算下一个项目),但是这两种方法都比使用简单的 while 循环更复杂和晦涩,所以我个人更喜欢 while
循环。
我不太好的 reduce 实现(结果它使用数组而不是范围,因为通过查看 NSRange
我不认为你可以创建一个不按 1 步进的范围):
let merkleTree = [1,2,3,4,5,6,7,8,9]
let numberOfDivisions = Int(log2(Double(merkleTree.count))) + 1
let startValue = merkleTree.count
let nSizes = (0..<numberOfDivisions).reduce([startValue]) { (result, next) -> [Int] in
var newResult = result
newResult.append((result.last! + 1) / 2)
return newResult
}
print(nSizes)
// and now you can for-in it:
for nSize in nSizes {
// ...
}