let array = [1, 2, 3, 4, 5]
現(xiàn)在有需求將array里的元素全部變成字符串
func convertString(_ array: [Int]) -> [String] {
var result = [String]()
for item in array {
result.append(String(item))
}
return result
}
現(xiàn)在有需求將數(shù)組里的全部元素*2
func convertString(_ array: [Int]) -> [Int] {
var result = [Int]()
for item in array {
result.append(item * 2)
}
return result
}
現(xiàn)在有需求將數(shù)組里的全部元素 + 10
....復(fù)制上面代碼,改一點(diǎn)點(diǎn).
可以通過系統(tǒng)map函數(shù)做到.
但是下面就自己寫一個(gè)map函數(shù)當(dāng)做學(xué)習(xí)
也是給Array做個(gè)擴(kuò)展
從上面的各種需求來(lái)看,其實(shí)就是拿到數(shù)組里的每一個(gè)元素做處理
就從這開始著手:
定義一個(gè)泛型函數(shù),函數(shù)需要返回什么類型,有調(diào)用者自己決定.
- 函數(shù)有一個(gè)參數(shù),是一個(gè)block類型,這個(gè)block里會(huì)將數(shù)組的元素當(dāng)做參數(shù)帶出去,拿* 到這個(gè)參數(shù)需要做什么處理有調(diào)用者自己決定(就像上面的需求一樣,或是乘以2 或是變成字符串,或者干嘛,隨意)
- block還有一個(gè)返回值,返回值是泛型類型,就是你拿到數(shù)組元素處理完以后的類型.
- 函數(shù)還有一個(gè)返回值,返回的是一個(gè)數(shù)組,就是處理完每一個(gè)元素以后得到的新值,數(shù)組類型也是有處理時(shí)的類型決定,也是一個(gè)泛型
extension Array {
public typealias element = Array.SubSequence.Element
func customMap<T>(_ transform: (element) -> T) -> [T] {
var result = [T]()
for item in self {
result.append(transform(item))
}
return result
}
}
使用:
[1,2,3,4,5].customMap({$0 * 2})
[1,2,3,4,5].customMap { (item) -> String in
return String(item)
}
學(xué)習(xí)筆記.