【问题标题】:How to fix C-style for statement has been removed in Swift 3?如何修复 C 风格的 for 语句已在 Swift 3 中删除?
【发布时间】:2018-01-02 08:26:21
【问题描述】:

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

我认为这不能再用 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 {
    // ...
}

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多