swift 高階函數(shù)使用

sort , forEach, filter, first(where:), last(where:) removeAll(where:), allSatisfy, map, reduce

// MARK: sort
func testSort() {
    var array1 = ["Animal", "Baby", "Apple", "Google", "Aunt"]
    array1.sort()
    let array2 = ["Animal", "Baby", "Apple", "Google", "Aunt"]
    array2.sorted()

    /**
     1. 默認(rèn)是升序
     2. sorted 返回一個(gè)新的集合
     3. sort 直接在原來的集合上操作
     */

    //降序
    array1.sort() { (str1, str2) in
        return str1 > str2 // 9times
    }
    array2.sorted() { (str1, str2) in
        return str1 > str2
    }

    //降序 簡(jiǎn)寫
    array1.sort { return $0 > $1 } // 10times
    array2.sorted { return $0 > $1 }
}

// MARK: forEach
func testForEach() {
    let array1 = ["Animal", "Baby", "Apple", "Google", "Aunt"]
    array1.forEach { str in print(str) }
    array1.forEach { print($0) }
}


// MARK: filter & first(where:) & last(where:) & removeAll(where:)
func testFilter() {
    var array1 = ["Animal", "Baby", "Apple", "Google", "Aunt"]
    /**
     篩選里面的閉包必須返回Bool杭跪, 篩選出返回true的元素
     */
    array1.filter { str in
        str.hasPrefix("A")
    }.forEach{ print($0) }

    array1.filter { $0.hasPrefix("A") }.forEach{ print($0) }
    
    // 篩選出第一個(gè)符合條件的元素
    let ele1 = array1.first { $0.hasPrefix("G") }
    ele1
    // 篩選出隨后一個(gè)符合條件的元素
    let ele2 = array1.last { $0.hasPrefix("B") }
    ele2
    //刪除符合條件的元素
    array1.removeAll { $0.hasPrefix("A") }
    array1
}

// MARK: allSatisfy
func testAllSatisfy() {
    /**
     檢查序列中所有元素是否滿足條件耀态,全部滿足才返回true
     */
    let scores = [86, 88, 95, 90]
    let passed = scores.allSatisfy {
        $0 > 80
    }
    passed
}

// MARK: map & compactMap & mapValues & compactMapValues
func testMap() {
    /**
     閉包返回一個(gè)變換后的元素,所有變換后的元素組成一個(gè)新的集合
     */
    let newStr = "test".map { "\($0) - new" }
    newStr

    let array3 = ["array1","array2","array3","array4","array5"]
    let array3New = array3.map { "\($0)-new" }
    array3 // ["array1", "array2", "array3", "array4", "array5"]
    array3New // ["array1-new", "array2-new", "array3-new", "array4-new", "array5-new"]

    let dic = ["key1": "value1"]
    let dicNew = dic.map { ["\($0.key)-new" : "\($0.value)-new"] }
    dic // ["key1": "value1"]
    dicNew // [["key1-new": "value1-new"]]

    /**
     compactMap 可以過濾掉空元素
     compactMap(flatMap 被廢棄了) 可以過濾掉空元素,
     */
    let array4 = ["array1","array2", nil ,"array4","array5"]
    let list1 = array4.map { $0 }
    list1 // ["array1", "array2", nil, "array4", "array5"]
    let list2 = array4.compactMap { $0 }
    list2 // "array1", "array2", "array4", "array5"]

    /**
     mapValues & compactMapValues 專門用于字典
     */
    let dic1 = ["1": "1", "2": "2", "3": "3", "4": "r", "5": "5"]
    /**
     mapValues類似數(shù)組中的map鸳吸,只是專門針對(duì)字典的values, mapValues 返回的還是一個(gè)字典
     如果在字典上用map淋样,返回的是數(shù)組(key/value)
     
     compactMapValues 類似數(shù)組中的compactMap酗失,過濾掉不符合條件的內(nèi)容启具,只是專門針對(duì)字典的values, compactMapValues 返回的還是一個(gè)字典
     如果在字典上用compactMap蕊玷,返回的是數(shù)組(key/value)
     */
    let result1 = dic1.mapValues { Int($0)}
    result1 // ["4": nil, "5": 5, "3": 3, "1": 1, "2": 2]
    let result2 = dic1.map { Int($0.value)} // [nil, 5, 3, 1, 2]
    result2
    let result3 = dic1.compactMapValues { Int($0) } // ["2": 2, "1": 1, "3": 3, "5": 5]
    result3
    let result4 = dic1.compactMap { Int($0.value) } // [5, 2, 3, 1]
    result4
}

// MARK: reduce 把多個(gè)元素的值合并為一個(gè)新的值
func testReduce() {
    
    let sum = [1, 3, 3, 4]
    let start = 102
    
    /**
     可以把多個(gè)元素的值合并成一個(gè)新的值
     start: 設(shè)置初始狀態(tài)
     result: 中間結(jié)果
     num: 集合中的每個(gè)元素
     */
    //直接返回結(jié)果
    let total = sum.reduce(start) { result, num -> Int in
        print("result \(result); num \(num)")
        return result+num
    }
    total // 113
    
    //不返回結(jié)果
    var into = 102
    let total2 = sum.reduce(into: into) { result, num in
        print("result \(result); num \(num)")
        into += num
        print("into \(into)")
    }
    into // 113
    total2 // 102
    
    //簡(jiǎn)寫1
    let total3 = sum.reduce(start) { $0 + $1}
    total3 // 113
    
    //簡(jiǎn)寫2
    let total4 = sum.reduce(start, +)
    total4 // 113
    
    //字符串 reduce
    let total5 = ["a","b","c"].reduce("1", { $0 + ", " + $1})
    total5 // "1, a, b, c"
    
    let dic = ["1": "value1", "2": "value2", "3": "value3", "4": "valuer", "5": "value5"]
    let reduceResult = dic.reduce("======") { (result, item: (key: String, value: String)) -> String in
        result + item.value
    }
    reduceResult // "======value2value3value5value1valuer"
    
}
//testReduce()

// MARK: 組合方法
func comminMethod() {
    let array1 = ["Animal", "Baby", "Apple", "Google", "Aunt"]
    array1
        .sorted{ $0 > $1}
        .filter { $0.hasPrefix("A")}
        .forEach { print($0) }
}
comminMethod()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末心赶,一起剝皮案震驚了整個(gè)濱河市扣讼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缨叫,老刑警劉巖椭符,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耻姥,居然都是意外死亡艰山,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門咏闪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曙搬,“玉大人,你說我怎么就攤上這事鸽嫂∽葑埃” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵据某,是天一觀的道長(zhǎng)橡娄。 經(jīng)常有香客問我,道長(zhǎng)癣籽,這世上最難降的妖魔是什么挽唉? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮筷狼,結(jié)果婚禮上瓶籽,老公的妹妹穿的比我還像新娘。我一直安慰自己埂材,他們只是感情好塑顺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俏险,像睡著了一般严拒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竖独,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天裤唠,我揣著相機(jī)與錄音,去河邊找鬼莹痢。 笑死种蘸,一個(gè)胖子當(dāng)著我的面吹牛墓赴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劈彪,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼竣蹦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼顶猜!你這毒婦竟也來了沧奴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤长窄,失蹤者是張志新(化名)和其女友劉穎滔吠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挠日,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疮绷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚣潜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬骚。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖懂算,靈堂內(nèi)的尸體忽然破棺而出只冻,到底是詐尸還是另有隱情,我是刑警寧澤计技,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布喜德,位于F島的核電站,受9級(jí)特大地震影響垮媒,放射性物質(zhì)發(fā)生泄漏舍悯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一睡雇、第九天 我趴在偏房一處隱蔽的房頂上張望萌衬。 院中可真熱鬧,春花似錦它抱、人聲如沸奄薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馁蒂。三九已至,卻和暖如春蜘腌,著一層夾襖步出監(jiān)牢的瞬間沫屡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工撮珠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沮脖,地道東北人金矛。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像勺届,于是被迫代替她去往敵國(guó)和親驶俊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容