Swift 3移除C风格for语句后的循环转换问题及修复方法
Swift 3 迁移:替换C风格for循环的正确方式
首先,咱们先拆解下你原来的Swift 2代码逻辑:
for (var nSize = merkleTree.count; nSize > 1; nSize = (nSize + 1) / 2) { //... }
这个循环的核心是每次迭代都基于当前的nSize计算下一次的值,步长不是固定的——这也是你用stride失败的原因:stride(to:by:)要求by参数是一个固定的步长值,没法引用循环过程中动态变化的nSize,所以才会报“Use of unresolved identifier 'nSize'”的错误。
那Swift 3里该怎么完美适配这个逻辑呢?直接用while循环就可以,代码如下:
var nSize = merkleTree.count while nSize > 1 { // 把原来循环体里的代码放在这里 // 按照原规则更新nSize nSize = (nSize + 1) / 2 }
这段代码完全复刻了原C风格循环的行为:
- 初始化
nSize为merkleTree.count - 只要
nSize > 1就继续执行循环体 - 每次循环结束后按原逻辑更新
nSize
以后再遇到类似步长依赖当前循环变量的C风格for循环,都可以用这种while循环的方式迁移,比强行套用stride更直观,也更符合Swift的语法规范。
内容的提问来源于stack exchange,提问作者Varun Naharia
相关产品推荐
相关产品推荐

