是否有一个函数,我可以使用迭代数组,并有索引和元素,像Python的枚举?
for index, element in enumerate(list):
...
是否有一个函数,我可以使用迭代数组,并有索引和元素,像Python的枚举?
for index, element in enumerate(list):
...
当前回答
使用.enumerate()可以,但它不能提供元素的真实索引;它只为每个连续的元素提供一个以0开始并加1的Int值。这通常是无关紧要的,但是当与ArraySlice类型一起使用时,可能会出现意想不到的行为。取以下代码:
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
这是一个有点做作的例子,在实践中也不是一个常见的问题,但我仍然认为值得知道这是可能发生的。
其他回答
为了完整起见,你可以简单地遍历你的数组下标,并使用下标访问对应下标处的元素:
let list = [100,200,300,400,500]
for index in list.indices {
print("Element at:", index, " Value:", list[index])
}
使用forEach
list.indices.forEach {
print("Element at:", $0, " Value:", list[$0])
}
使用集合枚举()方法。注意,它返回一个包含偏移量和元素的元组集合:
for item in list.enumerated() {
print("Element at:", item.offset, " Value:", item.element)
}
使用forEach:
list.enumerated().forEach {
print("Element at:", $0.offset, " Value:", $0.element)
}
这些会打印出来
元素:0值:100 元素在:1值:200 元素在:2值:300 元素在:3值:400 元素在:4值:500
如果你需要数组索引(而不是偏移量)和它的元素,你可以扩展Collection并创建自己的方法来获取索引元素:
extension Collection {
func indexedElements(body: ((index: Index, element: Element)) throws -> Void) rethrows {
var index = startIndex
for element in self {
try body((index,element))
formIndex(after: &index)
}
}
}
Alex建议的另一种可能的实现是用集合的元素压缩索引:
extension Collection {
func indexedElements(body: ((index: Index, element: Element)) throws -> Void) rethrows {
for element in zip(indices, self) { try body(element) }
}
var indexedElements: Zip2Sequence<Indices, Self> { zip(indices, self) }
}
测试:
let list = ["100","200","300","400","500"]
// You can iterate the index and its elements using a closure
list.dropFirst(2).indexedElements {
print("Index:", $0.index, "Element:", $0.element)
}
// or using a for loop
for (index, element) in list.indexedElements {
print("Index:", index, "Element:", element)
}
这将是p[print]
索引:2元素:300 指数:3元素:400 指数:4元素:500 索引:0元素:100 指数:1元素:200 索引:2元素:300 指数:3元素:400 指数:4元素:500
这是枚举循环公式:
for (index, value) in shoppingList.enumerate() {
print("Item \(index + 1): \(value)")
}
更多详情请点击这里。
是的。从Swift 3.0开始,如果需要每个元素的索引及其值,可以使用enumeration()方法遍历数组。它返回一个由索引和数组中每个项的值组成的对序列。例如:
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)")
}
斯威夫特5. x:
Let list = [0,1,2,3,4,5]
list.enumerated().forEach { (index, value) in
print("index: \(index), value: \(value)")
}
Or,
list.enumerated().forEach {
print("index: \($0.offset), value: \($0.element)")
}
Or,
for (index, value) in list.enumerated() {
print("index: \(index), value: \(value)")
}
基本枚举
for (index, element) in arrayOfValues.enumerate() {
// do something useful
}
或者用Swift 3…
for (index, element) in arrayOfValues.enumerated() {
// do something useful
}
枚举,过滤和映射
但是,我最常将enumerate与map或filter结合使用。例如,在一对数组上操作。
在这个数组中,我想过滤奇数或偶数索引元素,并将它们从整型转换为双精度。所以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)
})