Swift 快速枚举函数。它是如何工作的?
枚举函数为由索引和该项的值组成的数组中的每个项返回一个元组 map函数返回一个元素数组,该数组是根据为数组中的每个元素应用提供的转换闭包的结果构建的 声明:Swift 快速枚举函数。它是如何工作的?,swift,enumerate,Swift,Enumerate,枚举函数为由索引和该项的值组成的数组中的每个项返回一个元组 map函数返回一个元素数组,该数组是根据为数组中的每个元素应用提供的转换闭包的结果构建的 声明: func map<U>(transform: (T) -> U) -> [U] 那很好。工作 var numbers = [1, 2, 3] var result = map(enumerate(numbers)) { (index, element) in index + element } //[1,
func map<U>(transform: (T) -> U) -> [U]
那很好。工作
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]
EnumerateSequence
是一种类型,它保留另一个序列(在您的例子中是数组[1,2,3]
),然后当被要求生成一个元素时,从它包含的序列中生成下一个元素以及递增的数字。您想看看以下答案:
map函数用于元组,因为它使用的是swift标准库中的map函数,该函数适用于任何
SequenceType
。因此,它实际上使用的是枚举的索引和值,这与map函数在查看数组输入时使用的索引和元素相同。但是enumerate如何知道它应该为每个项返回不同的元组呢?。它只调用一次,不是吗?请参见我的编辑:enumerate
返回实现SequenceType
func map<S : SequenceType, T>(source: S, transform: (S.Generator.Element) -> T) -> [T]
// enumerate is a function that takes any kind of sequence, and returns
// an EnumerateSequence object
func enumerate<Seq : SequenceType>(base: Seq) -> EnumerateSequence<Seq>