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。 这通常是不相关的,但与ArraySlice
types一起使用时,可能会出现意外的行为。 采取以下代码:
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