在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)