swift for循环:索引,数组中的元素?

有一个函数,我可以用来遍历数组,并有索引和元素,如python的枚举?

for index, element in enumerate(list): ... 

是。 从Swift 3.0开始,如果需要每个元素的索引及其值,则可以使用enumerated()方法遍历数组。 它返回一个由索引和数组中每个项目的值组成的元组。 例如:

 for (index, element) in list.enumerated() { print("Item \(index): \(element)") } 

在Swift 3.0之前和Swift 2.0之后,函数被调用了enumerate()

 for (index, element) in list.enumerate() { print("Item \(index): \(element)") } 

在Swift 2.0之前, enumerate是一个全局函数。

 for (index, element) in enumerate(list) { println("Item \(index): \(element)") } 

从Swift 2开始,需要在集合上调用枚举函数,如下所示:

 for (index, element) in list.enumerate() { print("Item \(index): \(element)") } 

Swift 3为Array提供了一个名为enumerated()的方法。 enumerated()具有以下声明:

 func enumerated() -> EnumeratedSequence<Array<Element>> 

返回对(n,x)的序列,其中n表示从零开始的连续整数,x表示序列的元素。


在最简单的情况下,你可以使用enumerated()和for循环。

例如:

 let list = ["Car", "Bike", "Plane", "Boat"] for (index, element) in list.enumerate() { print(index, ":", element) } /* prints: 0 : Car 1 : Bike 2 : Plane 3 : Boat */ 

但请注意,您不限于使用enumerated()与for循环。

实际上,如果您打算将enumerated()与for循环用于类似于以下代码的内容,那么您就错了:

 let list = [Int](1...5) var arrayOfTuples = [(Int, Int)]() for (index, element) in list.enumerated() { arrayOfTuples += [(index, element)] } print(arrayOfTuples) // prints [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

正确的方法是:

 let list = [Int](1...5) let arrayOfTuples = Array(list.enumerated()) print(arrayOfTuples) // prints [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

作为替代,您也可以使用enumerated()map

 let list = [Int](1...5) let arrayOfDictionaries = list.enumerated().map { (a, b) in return [a : b] } print(arrayOfDictionaries) // prints [[0: 1], [1: 2], [2: 3], [3: 4], [4: 5]] 

而且,虽然它有一些限制 , forEach可以很好地代替for循环:

 let list = [Int](1...5) list.reversed().enumerated().forEach { print($0, ":", $1) } /* prints: 0 : 5 1 : 4 2 : 3 3 : 2 4 : 1 */ 

通过使用enumerated()makeIterator() ,你甚至可以手动迭代你的Array

例如:

 import UIKit class ViewController: UIViewController { var generator = ["Car", "Bike", "Plane", "Boat"].enumerated().makeIterator() // Link this IBAction to a UIButton in your storyboard @IBAction func iterate(_ sender: UIButton) { let tuple: (offset: Int, element: String)? = generator.next() print(String(describing: tuple)) } } /* Will print the following lines for 6 `touch up inside`: Optional((0, "Car")) Optional((1, "Bike")) Optional((2, "Plane")) Optional((3, "Boat")) nil nil */ 

我find了这个答案,同时寻找一种方法来做到这一点与字典 ,事实certificate,它是很容易适应它,只是传递元素的元组。

 // Swift 2 var list = ["a": 1, "b": 2] for (index, (letter, value)) in list.enumerate() { print("Item \(index): \(letter) \(value)") } 

基本枚举

 for (index, element) in arrayOfValues.enumerate() { // do something useful } 

枚举,filter和映射

但是,我经常使用枚举结合地图或filter。 例如在一些数组上运行。

在这个数组中,我想过滤奇数或偶数的索引元素,并将它们从Ints转换为双精度。 所以enumerate()得到你的索引和元素,然后filter检查索引,最后摆脱由此产生的元组映射到元素。

 let evens = arrayOfValues.enumerate().filter({ (index: Int, element: Int) -> Bool in return index % 2 == 0 }).map({ (_: Int, element: Int) -> Double in return Double(element) }) let odds = arrayOfValues.enumerate().filter({ (index: Int, element: Int) -> Bool in return index % 2 != 0 }).map({ (_: Int, element: Int) -> Double in return Double(element) }) 

这是枚举循环的公式:

 for (index, value) in shoppingList.enumerate() { print("Item \(index + 1): \(value)") } 

欲了解更多详情,你可以在这里查看

从Swift 3开始,就是这样

 for (index, element) in list.enumerated() { print("Item \(index): \(element)") } 

使用.enumerate()工作,但它不提供元素的真正的索引; 它只提供一个0开始的Int,每个后续的元素递增1。 这通常是不相关的,但与ArraySlicetypes一起使用时,可能会出现意外的行为。 采取以下代码:

 let a = ["a", "b", "c", "d", "e"] a.indices //=> 0..<5 let aSlice = a[1..<4] //=> ArraySlice with ["b", "c", "d"] aSlice.indices //=> 1..<4 var test = [Int: String]() for (index, element) in aSlice.enumerate() { test[index] = element } test //=> [0: "b", 1: "c", 2: "d"] // indices presented as 0..<3, but they are actually 1..<4 test[0] == aSlice[0] // ERROR: out of bounds 

这是一个有点人为的例子,在实践中这不是一个普遍的问题,但我认为值得知道这是可以发生的。

Xcode 8和Swift 3:数组可以使用tempArray.enumerate()枚举

例:

 var someStrs = [String]() someStrs.append("Apple") someStrs.append("Amazon") someStrs += ["Google"] for (index, item) in someStrs.enumerated() { print("Value at index = \(index) is \(item)"). } 

安慰:

 Value at index = 0 is Apple Value at index = 1 is Amazon Value at index = 2 is Google