柚子快報激活碼778899分享:swift 開發(fā)語言 iOS
柚子快報激活碼778899分享:swift 開發(fā)語言 iOS
iOS_Swift高階函數(shù)
#mermaid-svg-NxX1czIESDq47OQw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NxX1czIESDq47OQw .error-icon{fill:#552222;}#mermaid-svg-NxX1czIESDq47OQw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NxX1czIESDq47OQw .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NxX1czIESDq47OQw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NxX1czIESDq47OQw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NxX1czIESDq47OQw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NxX1czIESDq47OQw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NxX1czIESDq47OQw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NxX1czIESDq47OQw .marker.cross{stroke:#333333;}#mermaid-svg-NxX1czIESDq47OQw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NxX1czIESDq47OQw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NxX1czIESDq47OQw .cluster-label text{fill:#333;}#mermaid-svg-NxX1czIESDq47OQw .cluster-label span{color:#333;}#mermaid-svg-NxX1czIESDq47OQw .label text,#mermaid-svg-NxX1czIESDq47OQw span{fill:#333;color:#333;}#mermaid-svg-NxX1czIESDq47OQw .node rect,#mermaid-svg-NxX1czIESDq47OQw .node circle,#mermaid-svg-NxX1czIESDq47OQw .node ellipse,#mermaid-svg-NxX1czIESDq47OQw .node polygon,#mermaid-svg-NxX1czIESDq47OQw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NxX1czIESDq47OQw .node .label{text-align:center;}#mermaid-svg-NxX1czIESDq47OQw .node.clickable{cursor:pointer;}#mermaid-svg-NxX1czIESDq47OQw .arrowheadPath{fill:#333333;}#mermaid-svg-NxX1czIESDq47OQw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NxX1czIESDq47OQw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NxX1czIESDq47OQw .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-NxX1czIESDq47OQw .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-NxX1czIESDq47OQw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NxX1czIESDq47OQw .cluster text{fill:#333;}#mermaid-svg-NxX1czIESDq47OQw .cluster span{color:#333;}#mermaid-svg-NxX1czIESDq47OQw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NxX1czIESDq47OQw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
higher-order function in Swift
map 轉(zhuǎn)換
compactMap set/array取非空
compactMapValues dictionary取非空
flatMap 降維
filter 過濾
reduce 處理累積
1. 基礎(chǔ)知識
1.1 定義
高階函數(shù):higher-order function 如果一個函數(shù):
接受一個或多個函數(shù)當作參數(shù)把一個函數(shù)當作返回值 那么這個函數(shù)就被稱做高階函數(shù)。
例如:
let numbers = [1, 4, 2, 3]
let res = numbers.sort {
$0 < $1
}
看著不像是函數(shù)作為參數(shù),是因為 Swift 尾隨閉包 Trailing Closure 的特性。Swift 允許當函數(shù)的最后一個參數(shù)是閉包時,可以以緊跟 { } 的形式,將最后一個閉包的內(nèi)容附加在函數(shù)后面。
所以,以下兩行代碼是等價的:
// 正常寫法,函數(shù)是作為 sort 的參數(shù)
arr.sort({ $0 < $1 })
// Trailing Closure 寫法,更簡潔明了
arr.sort { $0 < $1 }
1.2 閉包語法
// 完整語法
nums.map({ (value: Int) -> Int in return value * 2 })
// 閉包語法
nums.map{ (value: Int) -> Int in return value * 2 }
// 省略返回值類型
nums.map{ (value: Int) in return value * 2 }
// 省略參數(shù)類型
nums.map{ value in return value * 2 }
// 省略 return
nums.map{ value in value * 2 }
// 省略參數(shù)
nums.map{ $0 * 2 }
2. 高階函數(shù)
2.1 map
2.1.1 集合類使用
遍歷集合處理后,組成新的集合
// 將數(shù)組中的字符串轉(zhuǎn)換為小寫字母
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
print(lowercaseNames) // ["vivien", "marlon", "kim", "karl"]
// 獲得數(shù)組中字符串的長度
let letterCounts = cast.map { $0.count }
print(letterCounts) // [6, 6, 3, 4]
2.1.2 Optional使用
Optional 也可以使用 map:
let num: Int? = 2
var res = num.map { $0 * 2 }
print(res)
/// 而不需要像以下這樣解包
if let num = num {
res = num * 2
} else {
res = nil
}
2.1.3 map 時獲得 index
需要在 map 前使用 enumerated:
let indexRes = cast.enumerated().map{ (index, element) in
return "\(index):\(element)"
}
print(indexRes)
2.2 compactMap
Array 和 Set 使用 compactMap 可獲得非空集合:
let possibleNumbers = ["1", "2", "three", "http:///4///", "5"]
let mapped = possibleNumbers.map { Int($0) }
print(mapped) // [Optional(1), Optional(2), nil, nil, Optional(5)]
// compactMap 獲得非 optional 元素
let compactMapped = possibleNumbers.compactMap { Int($0) }
print(compactMapped) // [1, 2, 5]
Dictionary 得用 compactMapValues 如下。
2.3 compactMapValues
Dictionary 使用 compactMapValues 可獲得非空的鍵值對集合:
let dict = ["a": "1", "b": "three", "c": "http:///4///"]
let maped = dict.mapValues { Int($0) }
print(maped) // ["a": Optional(1), "b": nil, "c": nil]
let compactMaped = dict.compactMapValues { Int($0) }
print(compactMaped) // ["a": 1]
2.4 flatMap
flatMap 可將多維的集合,降低為一維:
let dict = ["Momo": [1, 2, 3], "Bibi": [4, 5, 6]]
let res1 = dict.map { $0.value }
print(res1) // [[4, 5, 6], [1, 2, 3]]
let res2 = dict.flatMap { $0.value }
print(res2) // [4, 5, 6, 1, 2, 3]
2.5 filter
filter 可過濾出符合條件的元素集合
// 過濾字符串長度小于5的
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }
print(shortNames) // ["Kim", "Karl"]
2.6 reduce
reduce 可對集合遍歷累積處理結(jié)果:
// 計算所有元素和
let numbers = [1, 2, 3, 4]
let res = numbers.reduce(0, { x, y in
// 第一個參數(shù)為上次處理結(jié)果
// 第二個參數(shù)為當前遍歷到的元素
x + y
})
print(res) // 10
3.練習
3.1 用 reduce 實現(xiàn) map
let arr = [1, 3, 2]
let res = arr.reduce([]) { (a: [Int], element: Int) -> [Int] in
var tmp = Array(a)
tmp.append(element * 2)
return tmp
}
// res = [2, 6, 4]
關(guān)鍵點:result 用數(shù)組
3.2 用 reduce 一次求出數(shù)組中奇數(shù)的和、以及偶數(shù)乘積
let arr = [1, 3, 2, 4]
let res: (Int, Int) = arr.reduce((0, 1)) { (a :(Int, Int), element: Int) -> (Int, Int) in
if element % 2 == 0 {
return (a.0, a.1 * element)
} else {
return (a.0 + element, a.1)
}
}
// res = (4, 8)
關(guān)鍵點:result 用元組表示
3.3 使用高階函數(shù)求一個數(shù)組中偶數(shù)的平方和
let arr = [1, 3, 2, 4]
let res = arr.filter {
$0 % 2 == 0
}.map {
$0 * $0
}.reduce(0) {
$0 + $1
}
Reference: Apple Documentation for swift Swift 燒腦體操(三) - 高階函數(shù) 深入淺出Swift高階函數(shù)-Map、Filter、Reduce swift小知識點之高階函數(shù)之map, filter, reduce
柚子快報激活碼778899分享:swift 開發(fā)語言 iOS
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。