我刚刚将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循环。
答案 0 :(得分:9)
有关详细信息,请参阅Swift Evolution - Remove C style for-loops
引用推理:
for-in
和stride
使用Swift一致方法提供了相同的行为,而不依赖于传统术语。- 与简明中的for-in相比,使用for循环有明显的缺点
for-loop
实现不适合用于集合和其他核心Swift类型。for-loop
鼓励使用一元递增器和递减器,这些将很快从语言中移除。- 以冒号分隔的声明为来自非C语言的用户提供了陡峭的学习曲线
- 如果for循环不存在,我怀疑它是否会被考虑包含在Swift 3中。
醇>
总结:在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.filter
或array.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)")
}