Swift 'for - in' 循环的各种姿势

4,397 阅读2分钟

前言

Swift取消了OC中的C形式的for循环。只用一种单一的for - in形式来取代。 本文将为大家介绍几种for - in的姿势。

常规用法

常规用法与OC中的'for - in'用法一致,如:

let testArr = [9,7,3,8,5,2,1,0,6]
for num in testArr {
    print(num)
}

过去在OC中我们想获取遍历的元素的索引都要通过i来获得,现在可以通过enumerate来获取

for num in testArr.enumerated() {
    print(num.element,num.offset)
}

通过enumerate可以方便的获得元素的下标和内容。官方注释中也提到了另外一种写法,使用元祖来方便获取元素索引。

for (n, c) in "Swift".characters.enumerated() {
           print("\(n): '\(c)'")
       }
    ///     // Prints "0: 'S'"
    ///     // Prints "1: 'w'"
    ///     // Prints "2: 'i'"
    ///     // Prints "3: 'f'"
    ///     // Prints "4: 't'"

同时,swift也提供了reverse()方法,用法与enumerate一致,可以反向遍历数组中的元素。

区间循环

  • ...表示闭区间,如:0...10,表示0至10并且包含10
  • ..<表示开区间,如:0..<10 表示0至9,不包含10
for i in 0..<10 {
    print(i)
}
//0 1 2 3 4 5 6 7 8 9

for i in 0...10 {
    print(i)
}
//0 1 2 3 4 5 6 7 8 9 10

stride语法

stride语法提供了更大的灵活性,满足不同的递增条件以和开闭区间的结合。

func stride<T>(from start: T, to end: T, by stride: T.Stride)
func stride<T>(from start: T, through end: T, by stride: T.Stride)
//from:开始位置 by:递增步长
//to:结束位置,开区间,不包含
//through:结束位置,闭区间,包含

如:

for i in stride(from: 0, to: 10, by: 2) {
    print(i)
}
//0 2 4 6 8

for i in stride(from: 0, through: 10, by: 2) {
    print(i)
}
//0 2 4 6 8 10

如果我们想让i递减,可以将步长也就是by设置成负值,实现递减遍历。

总结

swfit中 'for - in'循环的几种用法十分方便,通过搭配能够为日常的编码带来带来效率的提升。