有什么好处Swift不赞成使用C风格的语句?

时间:2016-03-23 13:52:45

标签: swift

我刚刚将XCode更新为7.3,并对我的代码警告数量感到惊讶,特别是这个:

C-style for statement is deprecated and will be removed in a future version of Swift 

我看到了一些解决方案:

for idx in 0...<10 {}

for idx in 10.stride(to: 0, by: -1)

说真的,为什么?使用stride然后使用C风格的循环会更好吗?有什么好处?现在使用for-loop时我很困惑。我必须反复检查,看看我是否正确使用了for循环。

1 个答案:

答案 0 :(得分:9)

有关详细信息,请参阅Swift Evolution - Remove C style for-loops

引用推理:

  
      
  1. for-instride使用Swift一致方法提供了相同的行为,而不依赖于传统术语。
  2.   
  3. 与简明中的for-in相比,使用for循环有明显的缺点
  4.   
  5. for-loop实现不适合用于集合和其他核心Swift类型。
  6.   
  7. for-loop鼓励使用一元递增器和递减器,这些将很快从语言中移除。
  8.   
  9. 以冒号分隔的声明为来自非C语言的用户提供了陡峭的学习曲线
  10.   
  11. 如果for循环不存在,我怀疑它是否会被考虑包含在Swift 3中。
  12.   

总结:在Swift中迭代的方式比C风格for-loop有更好的方法(更具表现力)。

一些例子:

for-in超出范围:

for i in 0 ..< 10 {
    //iterate over 0..9
    print("Index: \(i)")
}

for i in (0 ..< 10).reverse() {
    //iterate over 9..0
    print("Index: \(i)")
}

对于数组(和其他序列),我们有很多选项(以下不是完整列表):

let array = ["item1", "item2", "item3"]

array.forEach {
    // iterate over items
    print("Item: \($0)")
}

array.reverse().forEach {
    // iterate over items in reverse order
    print("Item: \($0)")
}

array.enumerate().forEach {
    // iterate over items with indices
   print("Item: \($1) at index \($0)")
}

array.enumerate().reverse().forEach {
    // iterate over items with indices in reverse order
    print("Item: \($1) at index \($0)")
}

for index in array.indices {
    // iterate using a list of indices
    let item = array[index]
    print("Item \(item) at index: \(index)")
}

另请注意,如果要将数组转换为其他数组,则几乎总是要使用array.filterarray.map或它们的组合。

对于所有Strideable类型,我们可以使用stride方法生成索引,例如:

for index in 10.stride(to: 30, by: 5) {
    // 10, 15, 20, 25 (not 30)
    print("Index: \(index)")
} 

for index in 10.stride(through: 30, by: 5) {
    // 10, 15, 20, 25, 30
    print("Index: \(index)")
}

使用数组我们可以做到:

for index in 0.stride(to: array.count, by: 2) {
    // prints only every second item
    let item = array[index]
    print("Item \(item) at index: \(index)")
}