Swift 基本語法(六)— 函數式編程

在swift里函數成了一級公民,因此有必要了解下函數式編程

傳統命令式、面向對象式編程:
命令式編程常常迫使我們出去性能考慮,把不同的任務交織起來,以便能夠用一次循環來完成多個任務
函數式編程:
函數式編程會使用map()、filter()等這些高階函數,把我們解放出來,讓我們站在更高的抽象層次上去考慮問題,把問題看得更清楚。

面向對象編程通過封裝不確定因素來使代碼被人理解。 函數式編程通過盡量減少不確定因素來使代碼被人理解。

核心不同點

在面向對象的命令式編程語言中,重用的單元是類和類之間溝通用的消息。
函數式編程語言實現重用的思路很不一樣。函數式編程語言提倡在有限幾種關鍵數據結構(Array、list、set、map等)上運用針對這些數據結構高度優化后的操作,以此構成基本的運轉機制。 開發者在根據具體用途,插入自己的數據結構和運用高階函數去調整機構的運轉方式

比起一味創建新的類結構體系,把封裝的單元降低到函數單元,更有利于達到更細粒度、基礎層面的重用。
函數式編程喜歡使用少數幾個核心數據結構,去未圍繞他們建立一套充分優化的運轉機制。
面向對象編程喜歡不斷去創建新的數據結構和附屬操作,建立類與類之間溝通新消息。

舉個??:統計一段文本中除去特殊單詞其它單詞出現的次數

let non_words = ["i", "is", "a", "the", "there", "they", "you"]
let words = """
Stack Overflow is an open community for anyone that codes. We help you get answers to your toughest coding questions, share knowledge with your coworkers in private, and find your next dream job.
"""

//面向對象式編程
func totalFreq(words: String) -> [String : Int] {
    var wordDict: [String : Int] = [:]
    let wordList = words.split(separator: " ")
    for word in wordList {
        let lowerWord = word.lowercased()
        if !non_words.contains(lowerWord) {
            if let count = wordDict[lowerWord] {
                wordDict[lowerWord] = count + 1
            }else {
                wordDict[lowerWord] = 1
            }
        }
    }
    return wordDict
}

//print(totalFreq(words: words))
//函數式編程
func totalFreq2(words: String) -> [String : Int] {
    var wordDict: [String : Int] = [:]
    let wordList = words.split(separator: " ")
    //使用常用的數據類型, 然后在使用高階函數
    wordList.map{ $0.lowercased()} //小寫
    .filter({ !non_words.contains($0)})  //選出不包含的
    .forEach({ wordDict[$0] = (wordDict[$0] ?? 0) + 1})
    return wordDict
}
print(totalFreq2(words: words))

再來一個栗子??:

//將數組里除了單個字符的名字,首字母大寫,然后用,拼接輸出
let names = ["eddie", "gooo" , "z", "fan", "b" ,"chole"]
func findNames(names: [String]) -> String {
    var resultNames = ""
    for name in names {
        if name.count > 1 {
            resultNames += name.capitalized + "," //首字母大寫 并使用,分割
        }
    }
    resultNames.remove(at: resultNames.index(before: resultNames.endIndex))//移除最后一個,
    return resultNames
}
print(findNames(names: names))  //Eddie,Gooo,Fan,Chole

//函數式編程
names.map({ $0.capitalized })
.filter({ $0.count > 1 })
.joined(separator: ",")

print(names.map({ $0.capitalized })
    .filter({ $0.count > 1 })
    .joined(separator: ","))  //Eddie,Gooo,Fan,Chole

改成并發安全的。 自實現map方法

extension Array where Element: Any {
    func customMap<T>(_ transform: (Element) -> T) -> [T] {
        let count = self.count
        if count == 0 {
            return []
        }
        var result = Array<T>()
        result.reserveCapacity(count)
        let lock = NSLock.init()
        DispatchQueue.concurrentPerform(iterations: count) { (index) in
            lock.lock()
            result.append(transform(self[index]))
            lock.unlock()
        }
        return result
    }
}

let result = names.customMap({ $0.capitalized })
    .filter({ $0.count > 1 })
    .joined(separator: ",")
print(result)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容

  • 原文鏈接:https://github.com/EasyKotlin 值就是函數,函數就是值。所有函數都消費函數,...
    JackChen1024閱讀 6,022評論 1 17
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,121評論 1 32
  • 面向對象編程(OOP) 在前面的章節中,我們學習了Kotlin的語言基礎知識、類型系統、集合類以及泛型相關的知識。...
    Tenderness4閱讀 4,466評論 1 6
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,052評論 6 13
  • 今天是什么日子 起床:9:00 天氣:霾 心情:還好 任務清單 昨日完成的任務,最重要的三件事:學習理財,學習寫作...
    無非黑白閱讀 109評論 0 0