如何在Swift 3中删除C语句for语句?

问题描述 投票:0回答:1

我正在将旧的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'

ios for-loop swift3
1个回答
1
投票

我不认为这可以再用,但你可以使用while循环来完成工作:

var nSize = merkleTree.count
while nSize > 1 {
    // loop body

    nSize = (nSize + 1) / 2
}

我希望stride不能在这种情况下工作,因为正如你的错误所述,你不能使用nSize作为stride参数 - nSize是基于范围声明的迭代变量,所以你需要存在范围。至少那是我对错误的解释(我知道理论上你可以根据之前生成的项生成范围,但显然stride不会那样工作)。

我相信你可以找到一种方法来使用reduce生成一个正确的值数组(因为我能够,见下文,也许你可以使它变得更简单),或者通过实现你自己的stride来接受闭包而不是步骤(这将允许你根据前一个计算下一个项目),但这两种方法比使用简单的while循环更复杂和模糊,所以我个人更喜欢while循环。

我不太好减少实现(结果它使用数组而不是范围,因为通过查看NSRange我不认为你可以创建一个不逐步的范围):

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 {
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.