Swift 3.2中修改for循环的方法及循环异常问题求助
解决Swift 3.2中修改循环变量失效的问题
为什么你的Swift 3.2代码无法正常工作?
你遇到的问题核心在于Swift的for-in循环和传统C-style for循环的本质区别:
- 在Swift 2的
for(var i = 0 ; i < char.characters.count ; i += 1)中,i是直接控制循环进度的变量,你可以在循环体内修改它的值,直接影响下一次循环的判断条件。 - 而Swift 3.2中的
for var i in 0..<char.characters.count,这里的i只是遍历序列(0..<count这个Range)时的副本变量。哪怕你声明成var,修改i的值也只会改变这个副本,不会影响Range的遍历顺序——下一次循环仍然会取Range里的下一个元素,导致你想通过i = i -1让循环停留的逻辑完全失效,甚至可能提前退出循环。
正确的转换方式:用while循环模拟原逻辑
要保留你原来Swift 2代码中手动控制循环变量的逻辑,在Swift 3.2里应该使用while循环来替代,因为它能让你完全掌控循环变量的变化:
var i = 0 while i < char.characters.count { // 原有的条件判断逻辑 if self.characters.count > len && (currentIndex + length2323) < length { i -= 1 // 修改i会直接影响下一次循环的起始值 } i += 1 // 模拟原Swift 2循环中自动执行的i +=1 }
这段代码的逻辑和你原来的Swift 2代码完全一致:
- 每次循环先判断
i是否小于目标长度 - 满足条件时将
i减1,随后执行i +=1,相当于i保持原值,下一次循环会重复处理当前位置 - 不满足条件时,
i正常加1,进入下一个元素的处理
补充说明
Swift 3及以后的版本已经移除了C-style的for循环语法,如果你需要灵活控制循环进度(比如调整步长、重复处理某个元素),while循环是最适合的替代方案。for-in循环更适合遍历固定序列的场景,无法通过修改循环变量来改变遍历的顺序或节奏。
内容的提问来源于stack exchange,提问作者New-Learner
相关产品推荐
相关产品推荐

