我的Swift代码中有以下循环:
for var i:Int = 0, j:Int = 0; i < rawDataOut.count; i += 4, ++j {
maskPixels[j] = rawDataOut[i + 3]
}
Run Code Online (Sandbox Code Playgroud)
我在Xcode中收到两个警告:
我无法看到如何在Swift的For In Loops中重写这个,以考虑两个变量和4步,而不会让它变得混乱.有简单优雅的翻译吗?
dfr*_*fri 16
我会认为你打算限制i通过i < rawDataOut.count-3,而不是i < rawDataOut.count,否则rawDataOut[i + 3]按索引元素访问将没有多大意义WRT运行时的安全性.无论如何,没有你向我们展示rawDataOut,这是我们必须做出的假设.
因此,您的原始循环(包括可验证的示例)如下所示
/* example data */
var rawDataOut = Array(1...40)
var maskPixels = [Int](count: 10, repeatedValue: 0)
/* your pre-Swift 2.2/3.0 loop */
for var i: Int = 0, j: Int = 0; i < rawDataOut.count-3; i += 4, ++j {
maskPixels[j] = rawDataOut[i + 3]
}
print(maskPixels) //[4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
Run Code Online (Sandbox Code Playgroud)
for in ... where在您的特定示例情况下,多个增量具有简单的关系(j=4*i),因此我们可以在不使用显式j迭代的情况下解决此问题,例如
/* example data */
var rawDataOut = Array(1...40)
var maskPixels = [Int](count: 10, repeatedValue: 0)
/* your pre-Swift 2.2/3.0 loop */
for i in 0..<(rawDataOut.count-3) where i%4 == 0 {
maskPixels[i/4] = rawDataOut[i + 3]
}
print(maskPixels) // [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
Run Code Online (Sandbox Code Playgroud)
但对于两次迭代的一般性讨论,这可能不是真正感兴趣的.我们进入到一个2迭代方法相结合stride和enumerate.
stride和enumerate一种解决方案是在上面stride的循环i中枚举迭代描述,并使用枚举索引来构造第二个迭代(j上面).在您的示例中,enumerate索引完全对应于j,即
/* example data */
var rawDataOut = Array(1...40)
var maskPixels = [Int](count: 10, repeatedValue: 0)
/* Swift >= 2.2 loop */
for (j, i) in 0.stride(to: rawDataOut.count-3, by: 4).enumerate() {
maskPixels[j] = rawDataOut[i + 3]
}
print(maskPixels) // [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
Run Code Online (Sandbox Code Playgroud)
请注意,在斯威夫特3(相对于2.2),它好像默认的实现stride(to:by:),并stride(through:by:)以协议Strideable(非blueprinted扩展方法)将被depracated,那我们又回到了(如雨燕1.2)使用全局函数stride(from:to:by:)和stride(from:through:by:),例如见的当前主分支斯威夫特/ STDLIB /公/核心/ Stride.swift
while对于更棘手的情况,请在Swift 2.2之前的循环中标注为
for var i: Int = 0, j: Int = 0; i < rawDataOut.count-3; i += 4, j += i { ... }
Run Code Online (Sandbox Code Playgroud)
你可能最好只使用一个while循环,一个迭代与循环不变量相关联,一个循环迭代作为一个自由变量; 我想,这是否被认为是杂乱无味的问题.
var i = 0, j = 0
while i < rawDataOut.count-3 {
// ...
// increase iterates
i += 4
j += i
}
Run Code Online (Sandbox Code Playgroud)
我想去除C风格的循环的原因是它在大多数情况下,直接被覆盖for in,stride等等,而对于情况下,这些是不够的,良好的老" while,最有可能的,会的.
在Swift 4中
for index in stride(from: 0, to: 10, by: 2){
print(index)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11731 次 |
| 最近记录: |