map 函數(shù)的原型如下:
func map<U>(transform: (T) -> U) -> [U]
我們可以看到該函數(shù)使用了泛型欲侮。 (T) -> U 是一個泛型閉包宵距,它的意思就是類型 T 將會在閉包中進行邏輯處理,然后返回 U 類型愁溜。最后 map 函數(shù)會返回一個 U 類型的數(shù)組
通俗地講:
數(shù)組的 map 方法 它的參數(shù)就是一個閉包,它會將數(shù)組里的每一個元素放在閉包中進行處理,然后返回一個新的數(shù)組郭蕉,甚至是與原數(shù)組不同元素類型的新數(shù)組
示例
func greetPeople(person: String) -> String
{
return "Hello, \(person)!"
}
let guestList = ["Chris", "Jill", "Tim"]
let fullGreetings = guestList.map(greetPeople)
print(fullGreetings) // ["Hello, Chris!", "Hello, Jill!", "Hello, Tim!"]
數(shù)組的 map 方法 它的參數(shù)是一個閉包,為什么可以傳入一個函數(shù)???
Swift中的函數(shù)就是閉包
閉包有三種形式:
1. 全局函數(shù)是一個有名字但不會捕獲任何值的閉包。
2. 嵌套函數(shù)是一個有名字并可以捕獲到其封閉函數(shù)域內(nèi)的值的閉包喂江。
3. 閉包表達式是一個利用輕量級語法所寫的召锈,可以捕獲其上下文中變量或常量值的匿名閉包。
將一個全局函數(shù) greetPeople 作為一個閉包來使用的
將 greetPeople 函數(shù)作為 guestList 數(shù)組的 map 函數(shù)的參數(shù)傳入获询,并返回一個新的數(shù)組 fullGreetings
1.閉包表達式其實是函數(shù)的字面值涨岁,官方一般稱之為匿名函數(shù).一般當我們需要使用函數(shù)快速的實現(xiàn)一個簡短的處理邏輯并且只使用一次的時候,我們可以省去函數(shù)名
可以直接使用閉包表達式來處理
let fullGreetings = guestList.map({(person: String) -> String
in return "Hello, \(person)!"
})
2.Swift中有類型推斷的特性吉嚣,所以我們可以去掉參數(shù)類型
let fullGreetings = guestList.map({(person) -> String in
return "Hello, \(person)!"
})
3.編譯器可以根據(jù) in 之前的返回值類型和 return 之后的返回數(shù)據(jù)類型自動判斷梢薪,所以我們可以省略返回值和 return 關(guān)鍵字
let fullGreetings = guestList.map({person in
"Hello, \(person)!"
})
4.Swift中還提供了參數(shù)的簡寫方式: $0 代表第一個參數(shù)、 $1 代表第二個參數(shù)以此類推尝哆。所以我們又可以將參數(shù)名稱省略
let fullGreetings = guestList.map ({ "Hello,\($0)"})
5.當函數(shù)的最后一個參數(shù)是閉包時秉撇,可以將閉包寫在 () 之外,這也是Swift的一個特性,所以我們還可以繼續(xù)簡化
let fullGreetings = guestList.map(){ "Hello, \($0)!" }
6.當函數(shù)有且僅有一個參數(shù)畜疾,并且該參數(shù)是閉包時赴邻,不但可以將閉包寫在 () 外,還可以省略 ()
let fullGreetings = guestList.map{ "Hello, \($0)!" }
小練習
// 例子1:對一個Int類型數(shù)組的元素進行2倍放大啡捶。如:[1,2,3]->[2,4,6]姥敛。
let arr = [1,2,3]
let doubled = arr.map{
$0 * 2
}
print(doubled)
// 輸出:[2,4,6]
例子2: 將Int類型數(shù)組轉(zhuǎn)換為包含對應String類型的數(shù)。如:[16,58,510] -> ["OneSix", "FiveEight", "FiveOneZero"]瞎暑。
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 { ( num ) -> String in
var output = ""
var new = num
while new > 0 {
output = digitNames[new % 10]! + output
new /= 10
}
return output
}
print(strings)
// 輸出:["OneSix", "FiveEight", "FiveOneZero"]
參考文章
1.Swift中的閉包(Closure)
2.Swift Map方法