Swift 枚举函数。背后是如何运作的?

Swift enumerate functions. How does it work behind?

The enumerate function returns a tuple for each item in the array composed of the index and the value for that item.

The map function returns an array of elements built from the results of applying a provided transforming closure for each element in the array.

Declaration:

func map<U>(transform: (T) -> U) -> [U]
var numbers = [1, 2, 3]
numbers = map(numbers) { (index, element) in
    index + element
} //[1, 3, 5]

很好。作品。

var numbers = [1, 2, 3]
var result = map(enumerate(numbers)) { (index, element) in
    index + element
} //[1, 3, 5]

map 需要一个数组作为第一个参数,但我把元组 作为 enumerate fnction 的结果放在那里。

问题是:为什么有效?

之所以有效,是因为除了具有 map 方法的数组外,还有一个 map 函数可以接受任何类型的 SequenceType:

func map<S : SequenceType, T>(source: S, transform: (S.Generator.Element) -> T) -> [T]

这不仅适用于数组,还适用于任何类型的序列——字符串、范围、压缩序列对以及 enumerate 的结果,它也是一个序列:

// enumerate is a function that takes any kind of sequence, and returns 
// an EnumerateSequence object
func enumerate<Seq : SequenceType>(base: Seq) -> EnumerateSequence<Seq>

EnumerateSequence 是一种类型,它保留另一个序列(在您的例子中是数组 [1,2,3]),然后当被要求生成一个元素时,从它包含的序列中生成下一个元素数字递增。

您想查看以下答案:What's the cleanest way of applying map() to a dictionary in Swift?

map 函数适用于元组,因为它使用 swift 标准库中适用于任何 SequenceType 的 map 函数。所以它实际上是使用枚举的索引和值,这与 map 函数在查看数组输入时使用的索引和元素相同。