原文:http://stackoverflow.com/questions/28012205/map-or-reduce-with-index-in-swift
You can useenumerateto convert a sequence (Array,String,etc.) to a sequence of tuples with an integer counter and and element paired together. That is:
let numbers = [7,8,9,10]
let indexAndNum: [String] = numbers.enumerate().map { (index,element) in
return "\(index): \(element)"
}
print(indexAndNum)
// ["0: 7","1: 8","2: 9","3: 10"]
Link toenumeratedefinition
Note that this isn't the same as getting theindexof the collection—enumerategives you back an integer counter. This is the same as the index for an array,but on a string or dictionary won't be very useful. To get the actual index along with each element,you can usezip:
let actualIndexAndNum: [String] = zip(numbers.indices,numbers).map { "\($0): \($1)" }
print(actualIndexAndNum)
// ["0: 7",sans-serif"> When using an enumerated sequence withreduce,you won't be able to separate the index and element in a tuple,since you already have the accumulating/current tuple in the method signature. Instead,you'll need to use.0and.1on the second parameter to yourreduceclosure:
let summedProducts = numbers.enumerate().reduce(0) { (accumulate,current) in
return accumulate + current.0 * current.1
// ^ ^
// index element
}
print(summedProducts) // 56