閉包

Swift閉包(closures)有很多優(yōu)化的地方

  • 根據(jù)上下文推斷參數(shù)和返回值類型
  • 從單行表達(dá)式閉包中隱式返回(也就是閉包體只有一行代碼,可以省略return)
  • 可以使用簡(jiǎn)化參數(shù)名,如0,1(從0開始,表示第i個(gè)參數(shù)...)
  • 提供了尾隨閉包語法(Trailing closure syntax)
閉包完全體語法
{(s1: T, s2: T) -> Type in
    ///代碼實(shí)現(xiàn)
    ...
    return type
}
  • 代碼簡(jiǎn)寫
///自動(dòng)閉包
let student1 = {
   print("省略參數(shù)和 in")
}
  • 參數(shù)名稱縮寫
let sortBlock = { (s1: String, s2: String) -> Bool in
    ///完全體
    return s1 > s2
}
///$0、$1 表示第一個(gè) 第二個(gè)參數(shù)  縮寫1
let sortBlock1 = { return $0 > $1 }

  • 尾隨閉包,閉包作為最后一個(gè)參數(shù)的時(shí)候,可以省略掉參數(shù)名
func lastColosure(colosure: ()->()){
    colosure()
}

調(diào)用1
lastColosure(colosure: {       
})

簡(jiǎn)寫
lastColosure() {
}

當(dāng)只有閉包一個(gè)參數(shù)的時(shí)候,括號(hào)也可以省略
lastColosure {
}

Swift 中 閉包作為參數(shù)和返回值
閉包作為參數(shù)的時(shí)候,是在函數(shù)實(shí)現(xiàn)內(nèi)部調(diào)用這個(gè)閉包;閉包作為返回值,是在函數(shù)實(shí)現(xiàn)部分實(shí)現(xiàn)閉包。

作為參數(shù)
func getData(url: String, complete:(Data)->()){
    let data = NSData(contentsOfFile: url) as Data?
    /// 在此處調(diào)用 閉包
    complete(data)
}

/// 函數(shù)調(diào)用
getData(url: "") { data in
    /// 閉包實(shí)現(xiàn)
    print(data)
}
作為返回值  
方式一:內(nèi)部函數(shù)作為返回值,因?yàn)楹瘮?shù)的類型是  `(String) -> Int` 類型
func students(names: [String]) -> ((String) -> Int){
    func nameFunc(str: String) -> Int{
        return str.count
    }
    return nameFunc(str:)
}

方式二:
func students(names: [String]) -> ((String) -> Int){
    return { $0.count }
}

調(diào)用
let name = students(names: ["myk"])
let a = name("123")
`name` 是 `(String) -> Int`類型
`a` 是 `Int`類型

在學(xué)習(xí)RxSwift的時(shí)候,他的bind函數(shù)讓我困惑好久

bind函數(shù),有兩個(gè)參數(shù) A 和 B,參數(shù)A又是一個(gè)函數(shù)
參數(shù)A :參數(shù):信號(hào)   返回值:閉包
參數(shù)B:一個(gè)類型
func bind<R1, R2>(to binder: (Observable<[Self]>) -> (R1) -> R2, curriedArgument: R1) -> R2

Rx給出的一個(gè)例子中

Observable.just([1,2,3])
    .bind(to: picker1.rx.itemTitles, curriedArgument: { name, item in
         return "\(item)"
    })
      .disposed(by: dispose)

picker1.rx.itemTitlesitemTitles是一個(gè)函數(shù)類型
func itemTitles(_ source: Source) -> (@escaping (Int, Sequence.Element) -> String?) -> Disposable
它的類型是
(_ source: Source) -> (@escaping (Int, Sequence.Element) -> String?) -> Disposable
bind 函數(shù)的參數(shù)A (Observable<[Int]>) -> (R1) -> R2 類型是一樣的。
類比一下(@escaping (Int, Sequence.Element) -> String?) == R1,Disposable == R2。
bind函數(shù)的第二個(gè)參數(shù)curriedArgument也就是參數(shù)B, 傳的是一個(gè)R1類型的數(shù)據(jù),也就是 (@escaping (Int, Sequence.Element) -> String?)類型,因此參數(shù)B是一個(gè)閉包<也可以傳一個(gè)函數(shù)>。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 閉包是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用。Swift 中的閉包與 C 和 Objective-C 中的代...
    窮人家的孩紙閱讀 1,809評(píng)論 1 5
  • 版本記錄 前言 我是swift2.0的時(shí)候開始接觸的,記得那時(shí)候還不是很穩(wěn)定,公司的項(xiàng)目也都是用oc做的,并不對(duì)s...
    刀客傳奇閱讀 742評(píng)論 0 1
  • 引言 繼續(xù)學(xué)習(xí)Swift文檔,從上一章節(jié):函數(shù),我們學(xué)習(xí)了Swift函數(shù)相關(guān)的內(nèi)容,如函數(shù)的定義和使用、函數(shù)參數(shù)、...
    shiyueZ閱讀 2,003評(píng)論 0 1
  • 閉包是自包含的功能塊,可以在代碼中傳遞和使用。Swift中的閉包類似于C和Objective-C中的 Block ...
    明若晴空閱讀 1,470評(píng)論 0 1
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn),也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 7,685評(píng)論 0 4

友情鏈接更多精彩內(nèi)容