2016-04-04 46 views
0

如果循环找到不应存在的元素并将其删除,则循环递减循环计数器。如何在没有可变计数器的情况下编写Swift 3循环

 var iMax = numListViews 
     for var i = 0; i < numListViews; i += 1 { 
      if (columnsSortTypesArray[i] == "") { 
       columnsSortTypesArray.removeAtIndex(i) 
       i-- 
       iMax-- 
      } else { 
       listViews[i].sortList(columnsSortTypesArray[i]) 
      } 
     } 
+3

什么是'listViews'?而'columnsSortTypesArray',它是一个'String'数组吗?什么是'.sortList'方法应用于'i':'listView'的广播?请查看[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve),并可能使用更相关(但非臃肿)的信息更新您的问题。 – dfri

+4

您的原始代码已经有点混淆了。看看'filter()'方法! –

+1

另外,关于上述代码的注释:如果'columnsSortTypesArray'的长度(num。元素)只比numListViews略大,但包含多个''“'条目?这可能会在'columnsSortTypesArray [i]'(尝试)元素访问时产生一个运行时异常,因为'从'columnsSortTypesArray'(之后'columnsSortTypesArray'的长度可能是' dfri

回答

-1

您可以用while循环这样的替换任何C风格的数组:

var i = 0 
while i < numListViews { 
    // the rest of your code here 
    i += 1 
} 

我不知道如果这是你在找什么,但如果你能具体谈谈你的类型和为什么你想删除可变的计数器,我会尽力帮助。

+1

技术上正确,但绝不会通过代码审查。 – nhgrif

+0

在for循环中执行此操作有几个很好的理由。在这种情况下,作者正在修改循环变量,while循环几乎是在Swift中完成的唯一方法。当然修改循环内部的循环变量是一个不好的迹象,本身... – ColGraff

+0

这正是为什么这永远不会通过代码审查。在这种特定情况下,真正需要发生的是'.filter'调用,但我个人不会想到修改循环变量实际上是必要的任何情况。所以我必须申请我的downvote。如果你可以编辑这个来包含一个令人信服的例子,我会真正想要修改循环变量,我会考虑删除downvote。 – nhgrif

6

您不应该首先使用for循环。 修改循环内的循环变量很容易出错,并且为什么不推荐使用C风格for循环。

从数组中使用filter()删除空字符串:

columnsSortTypesArray = columnsSortTypesArray.filter { $0 != "" } 

要填充基于此阵列中的其他阵列,使用map(),例如

listViews = columnsSortTypesArray.map { sortList($0) } 

另外:如果有两个(或更多)阵列,它总是必须保持 同步,考虑以限定具有两个(或多个)属性 一个struct WhatEver并使用这些WhatEver元件的单个阵列代替。

相关问题