我正在将旧的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)
使用未解析的标识符' nSize'
答案 0 :(得分:1)
我认为不能再使用它了,但您可以使用while
循环来完成工作:
var nSize = merkleTree.count
while nSize > 1 {
// loop body
nSize = (nSize + 1) / 2
}
我希望stride
在这种情况下不起作用,因为正如您的错误所述,您无法使用nSize
作为stride
参数 - nSize
是迭代变量根据范围声明,因此您需要存在范围。至少那是我对错误的解释(我知道理论上你可以根据之前生成的项生成范围,但显然stride
不能那样工作)。
我相信你可以找到一种方法来使用reduce
生成适当的值数组(因为我能够,见下文,也许你可以使它变得更简单),或者通过实现你自己的{{1}这将接受一个闭包而不是一个步骤(这将允许你根据前一个计算下一个项目),但这两种方法比使用简单的while循环更复杂和模糊,所以我个人更喜欢stride
循环。
我的不太好的减少实现(结果它使用数组而不是范围,因为通过查看while
我不认为你可以创建一个不逐步的范围1):
NSRange