swift函數(shù)式編程-解決回調(diào)地獄

1、任何異步操作的參數(shù)必然是一些基本參數(shù)脆侮,加上回調(diào)函數(shù)锌畸!請仔細考慮這句話!>副堋潭枣!
2、假如說幻捏,我們將這么一個異步操作拆分開來:接收一個參數(shù)盆犁,返回一個回調(diào)函數(shù)?請仔細思考篡九,是否可以r伎埂!N拖隆翰铡!
一些燒腦的概念:
抽象的是一個計算過程————函數(shù)式變成精髓所在。讽坏。锭魔。@包涵卿
curried function 柯里化,
monad type 單子
functor 函子
Promises/A(http://wiki.commonjs.org/wiki/Promises/A)
what is promises(https://promisesaplus.com/)
promisesJs(https://www.promisejs.org/)

以上燒腦的概念路呜,需要大致的了解一下迷捧,至少能夠看得懂织咧,如果看懂了,那么下面那段代碼漠秋,應(yīng)該就沒有問題了笙蒙。

以下是 swift開發(fā)者大會上,傅若愚 解決回調(diào)地獄的核心代碼中庆锦,我稍加整理
主要是閉包的寫法讓人不是很好理解捅位,加了一些推導過程。
源碼路徑 https://github.com/lingoer/SwiftyCharms

import UIKit
import Foundation

enum Result<T> {
 case Success(T)
 case Failure(ErrorType)
}

func == <T: Equatable>(lhs: Result<T>, rhs: Result<T>) -> Bool {
 if case (.Success(let l), .Success(let r)) = (lhs, rhs) {
  return l == r
 }
 return false
}

extension Result {
 
 static func unit(x: T) -> Result<T> {
  return .Success(x)
 }
 
 func map<U>(f: T throws -> U) -> Result<U> {
  return flatMap { .unit(try f($0)) }
 }
 
 func flatMap<U>(f: T throws -> Result<U>) -> Result<U> {
  switch self {
  case .Success(let value):
   do {
    return try f(value)
   } catch let e {
    return .Failure(e)
   }
  case .Failure(let e):
   return .Failure(e)
  }
 }
 
 func apply<U>(rf: Result < T throws -> U >) -> Result<U> {
  return rf.flatMap(map)
 }
}

struct Async<T> {
 
 let trunk: (Result<T> -> Void) -> Void
 
 init(function: (Result<T> -> Void) -> Void) {
  trunk = function
 }
 
 func execute(callBack: Result<T> -> Void) {
  trunk(callBack)
 }
}

extension Async {
 
 static func unit(x: T) -> Async<T> {
  // return Async{ $0(.Success(x))}
  return Async(function: { trunk -> Void in
   trunk(.Success(x))
  })
 }
 
 func map<U>(transform: T throws -> U) -> Async<U> {
  // return flatMap { .unit(try transform($0)) }
  return flatMap({ tx in
   return Async<U>.unit(try transform(tx))
  })
 }
 
 func flatMap<U>(transform: T throws -> Async<U>) -> Async<U> {
  
  // 然后搂抒,就可以大神的代碼一樣了
  return Async<U> { trunk in
   self.execute {
    switch $0.map(transform) {
    case .Success(let async):
     async.execute(trunk)
    case .Failure(let err):
     trunk(.Failure(err))
    }
   }
  }
  // 然后在去掉 參數(shù)
//        return Async<U> { trunk in
//            self.execute{ result in
//                switch result.map(transform) {
//                case .Success(let async):
//                    async.execute(trunk)
//                case .Failure(let err):
//                    trunk(.Failure(err))
//                }
//            }
//        }
  // 里面那一層同樣的的道理艇搀,可以簡化為
//        return Async<U> { trunk in
//            self.execute({ (result) -> Void in
//                switch result.map(transform) {
//                case .Success(let async):
//                    async.execute(trunk)
//                case .Failure(let err):
//                    trunk(.Failure(err))
//                }
//            })
//        }
  // 括號只有一個參數(shù),括號可以不寫
//  return Async<U> { (trunk) in
//   self.execute({ (result) -> Void in
//    switch result.map(transform) {
//    case .Success(let async):
//     async.execute(trunk)
//    case .Failure(let err):
//     trunk(.Failure(err))
//    }
//   })
//  }
  // 返回值在末尾求晶,可以不寫
  
//  return Async<U> { (trunk)  in
//   self.execute({ (result) -> Void in
//    switch result.map(transform) {
//    case .Success(let async):
//     async.execute(trunk)
//    case .Failure(let err):
//     trunk(.Failure(err))
//    }
//   })
//  }
  // 最后一個參數(shù)焰雕,可以寫成{}在末尾
  
//        return Async<U> { (trunk) -> Void in
//            self.execute({ (result) -> Void in
//                switch result.map(transform){
//                case .Success(let async):
//                    async.execute(trunk)
//                case .Failure(let err):
//                    trunk(.Failure(err))
//                }
//            })
//        }
  // 最開始的狀況
//  return Async<U>(function: { trunk -> Void in
//   self.execute({ result -> Void in
//    switch result.map(transform) {
//    case .Success(let async):
//     async.execute(trunk)
//    case .Failure(let err):
//     trunk(.Failure(err))
//    }
//   })
//  })
 }
 
 func apply<U>(af: Async < T throws -> U >) -> Async<U> {
//        return af.flatMap({ (<#T#>) -> U throws -> Async<U> in
//            <#code#>
//        })
        //看到 T -> U -> Async<U> 沒,四核和map是一個樣的函數(shù)啊芳杏,只不過這個是curry版本的矩屁。所以,呵呵爵赵,直接替換
  return af.flatMap(map)
 }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末档插,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亚再,更是在濱河造成了極大的恐慌郭膛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氛悬,死亡現(xiàn)場離奇詭異则剃,居然都是意外死亡,警方通過查閱死者的電腦和手機如捅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門棍现,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镜遣,你說我怎么就攤上這事己肮。” “怎么了悲关?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵谎僻,是天一觀的道長。 經(jīng)常有香客問我寓辱,道長艘绍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任秫筏,我火速辦了婚禮诱鞠,結(jié)果婚禮上挎挖,老公的妹妹穿的比我還像新娘。我一直安慰自己航夺,他們只是感情好蕉朵,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阳掐,像睡著了一般始衅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锚烦,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音帝雇,去河邊找鬼涮俄。 笑死,一個胖子當著我的面吹牛尸闸,可吹牛的內(nèi)容都是我干的彻亲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吮廉,長吁一口氣:“原來是場噩夢啊……” “哼苞尝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宦芦,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宙址,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后调卑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抡砂,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年恬涧,在試婚紗的時候發(fā)現(xiàn)自己被綠了注益。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡溯捆,死狀恐怖丑搔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情提揍,我是刑警寧澤啤月,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站劳跃,受9級特大地震影響顽冶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜售碳,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一强重、第九天 我趴在偏房一處隱蔽的房頂上張望绞呈。 院中可真熱鬧,春花似錦间景、人聲如沸佃声。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圾亏。三九已至,卻和暖如春封拧,著一層夾襖步出監(jiān)牢的瞬間志鹃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工泽西, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曹铃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓捧杉,卻偏偏與公主長得像陕见,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子味抖,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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