循环中Swift样式的多个增量

循环中Swift样式的多个增量,第1张

概述我的 Swift代码中有以下循环: for var i:Int = 0, j:Int = 0; i < rawDataOut.count; i += 4, ++j { maskPixels[j] = rawDataOut[i + 3]} 我在Xcode中收到两个警告: >不推荐使用C-style for语句,将在未来的Swift版本中删除 >”已弃用:它将在Swift 3中删除 我无法看 我的 Swift代码中有以下循环:

for var i:Int = 0,j:Int = 0; i < rawDataOut.count; i += 4,++j {    maskPixels[j] = rawDataOut[i + 3]}

我在Xcode中收到两个警告:

>不推荐使用C-style for语句,将在未来的Swift版本中删除
>”已弃用:它将在Swift 3中删除

我无法看到如何在Swift的For In Loops中重写这一点,以考虑两个变量和4步,而不会让它变得混乱.有简单优雅的翻译吗?

解决方法 回答这个问题的先决条件:查看你的例子

我会假设你打算用i< rawDataOut.count-3而不是i< rawDataOut.count,否则通过索引访问rawDataOut [i 3]元素对w.r.t没有多大意义.运行时安全.无论如何,如果没有向我们展示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]

用于…在哪里

在您的特定示例情况下,多个增量具有简单的关系(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,40]

但对于两次迭代的一般性讨论,这可能不是真正有意义的.我们继续结合strIDe和enumerate的2迭代方法.

结合步幅和枚举

一种@R_301_6954@案是枚举上面循环中迭代i描述的步幅,并使用枚举索引构造第二个迭代(上面的j).在您的示例中,枚举索引与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,40]

请注意,在Swift 3中(与2.2相比),似乎strIDe(to:by :)和strIDe(through:by :)到协议Strideable(作为非蓝图扩展方法)的默认实现将被删除,并且我们回到(如在Swift 1.2中)使用全局函数strIDe(from:to:by :)和strIDe(from:through:by :),参见eg目前swift/stdlib/public/core/Stride.swift的主分公司

棘手的案例:诉诸于

对于更棘手的情况,请在Swift 2.2之前的循环中标注为

for var i: Int = 0,j += i { ... }

你可能最好只使用一个while循环,一个迭代与循环不变量相关联,一个尾随迭代作为一个自由变量;我想,这是否被认为是杂乱无味的问题.

var i = 0,j = 0while i < rawDataOut.count-3 {    // ...    // increase iterates    i += 4    j += i}

我假设删除C风格循环的原因是,在大多数情况下,它直接被in,strIDe等覆盖,而对于这些不足够的情况,一个好的旧的’虽然,很可能会.

总结

以上是内存溢出为你收集整理的循环中Swift样式的多个增量全部内容,希望文章能够帮你解决循环中Swift样式的多个增量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1013990.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存