Arrays 在swift 2.1中使用map()方法

Arrays 在swift 2.1中使用map()方法,arrays,methods,Arrays,Methods,我从Apple library中获得了这段代码,我试图理解map()方法是如何工作的 let digitNames = [ 0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine" ] let numbers = [16, 58, 510] let strings = numbers.map { (var nu

我从Apple library中获得了这段代码,我试图理解map()方法是如何工作的

let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]


let strings = numbers.map {
  (var number) -> String in
    var output = ""
    while number > 0 {
        output = digitNames[number % 10]! + output
        number /= 10
    }
    return output
}
规范中规定闭包计算
最后一位使用%提醒运算符和此数字的“数字” (即var编号)用于
在“digitNames”中查找适当的字符串

为什么它计算“数字”的最后一位而不是第一位? “输出”字符串是如何生成的

我的理解是 第一次迭代: 当数字=1时,输出=[“一”] 和数字/10=0 因为数字1是“digitNames”字典中的有效键,“number”等于0
“一”将在关闭时返回。 现在,对“numbers”数组调用map()方法,并将“One”添加到“output”

map()方法是否只将闭包的返回添加到“输出”中
数组一次“number”=0,还是检查输出值是否包含在 将闭包返回添加到“输出”之前的“数字”

我的理解是,尽管这肯定是不对的: 对于数字=1…9 数字/10等于0,因此满足while循环条件
number>0,则闭包将“输出”返回为number+output和
打造“一二三”。 所以

number = 1, output = [One]
number = 2, output = [OneTwo] 
等等


你能一步一步地描述代码的流程以及它是如何工作的吗?

map方法在数组(或类似数组的东西)中循环,并为数组的每个元素返回一个新值。这些返回值形成一个新数组,该数组是
map
方法的结果。因此,原始数组的每个元素都映射到新数组的一个元素

map
方法知道如何处理原始数组的每个元素的方法是提供一个函数(通常,尽管不一定,是匿名函数)。该函数处理原始数组的一个元素,并返回一个值,为新数组的相应元素提供映射值

所以,在操场上玩耍,你会看到
[1,2,3,4]。地图{$0*2}
[2,4,6,8]
。为什么?因为我们在数组
[1,2,3,4]
中循环,我们提供的函数为每个元素返回该元素乘以2的结果

如果我写得更详细一些,也许会有所帮助:

[1,2,3,4].map {
    anElement in
    return anElement * 2
}
或者更详细地说:

func multiplyBy2(anElement:Int) -> Int {
    return anElement * 2
}
[1,2,3,4].map (multiplyBy2)
你可以看到苹果的例子也是如此。同样,如果我将map函数表示为实际函数,并在将其用作map函数之前单独尝试,可能会有所帮助。因此:

let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
func wordify(number:Int) -> String {
    var output = ""
    var number = number
    while number > 0 {
        output = digitNames[number % 10]! + output
        number /= 10
    }
    return output
}
好的,让我们在几个数字上试试

wordify(16) // "OneSix"
wordify(58) // "FiveEight"
wordify(510) // "FiveOneZero"
好的,让我们在
map
中使用它:

let numbers = [16, 58, 510]
numbers.map(wordify) // ["OneSix", "FiveEight", "FiveOneZero"]
结果与我们将函数分别应用于数组的每个元素,并组合成一个数组完全相同,这正是我们所期望的。

Map是一个高阶函数,在数组上调用时将生成一个新数组(可能是不同类型的数组)其中,所有元素都是对原始数组的每个元素执行特定操作的结果。因此,我们将看一看它的类型签名(注意,这是完全过度简化的,因此我们可以关注map):

class[T]{
函数映射(T->U)->[U]
}
注意:理解swift中泛型类型的概念对于理解此示例非常重要

因此,map是一种在类型为
[T]
的数组上操作的方法(它只是
数组的语法糖)。我们可以看到map接受类型为
T->U
的闭包,这意味着给定一种类型,它可以返回另一种类型,例如
Int->String
Double->Double


从类型签名中,我们可以看到map返回类型为
[U]
的数组。因此,它从原始数组中获取每个元素,并将其提供给闭包,闭包返回一个类型为
U
的结果,然后将其添加到结果中。

您是在询问
map
还是在这段代码中
map
之后的花括号中的内容?@matt我在询问map方法在闭包上应用时是如何工作的作为它唯一的论点。好吧,我不知道“应用于闭包时”是什么意思,但是看看我的答案,看看它是否有用。我已经理解了上面例子中“map”是如何工作的map'调用'numbers'中的每个元素一次。第一个元素为16.16%10=6;[“六”]存储在“输出”16/10=1中;var数=1;在第二次迭代中,[“一”]被添加到“输出”,1%10=0;while循环结束其执行并返回'output'=“OneSix”,map将'output'字符串添加到'output'数组中。
class [T] {
  func map<T, U>(T -> U) -> [U]
}