Swift基礎(chǔ)--閉包

閉包表達(dá)式語(yǔ)法

閉包表達(dá)式語(yǔ)法有如下的一般形式:

  • 1

{ (parameters) -> (return type) in
statements
}
parameters--形式參數(shù)類(lèi)型
type -- 返回值類(lèi)型
statements -- 函數(shù)體
例如:

       let bibao = {( num :Int , num1:Int)  -> Int  in
          return num + num1   
       }
       let get1 =   bibao(20,30)
       print("bibao de jieguo \(get1)")

輸出結(jié)果:bibao de jieguo 50

  • 2
        //模式2 用一行書(shū)寫(xiě)
         let bibao = {( num :Int , num1:Int)  -> Int in return num + num1}
  • 3
        //模式3  省略 形式參數(shù)類(lèi)型,只使用返回值類(lèi)型
        let bibao = {num , num1  -> Int in return num + num1
        }

捕獲值

一個(gè)閉包能夠從上下文捕獲已被定義的常量和變量。即使定義這些常量和變量的原作用域已經(jīng)不存在,閉包仍能夠在其函數(shù)體內(nèi)引用和修改這些值。

    func bibao2 (number num3:Int,number11 num4:Int) -> () -> Int{
        var num5 = 4;
        func add() -> Int{
            num5 += num4;
            num5+=num3
            return num5
        }
        return add
    }

        let get2 =    bibao2(number: 5,number11: 100)
        print(get2())

輸出結(jié)果:109

分析:定義閉包bibao2,包含一個(gè)內(nèi)嵌函數(shù),可以捕獲上文的傳入?yún)?shù)num3,num4及內(nèi)部定義變量num5, 返回add 作為一個(gè)閉包,bibao2的返回類(lèi)型是() -> Int,說(shuō)明返回的是一個(gè)函數(shù),不需要任何形式參數(shù),每次調(diào)用返回一個(gè)返回值為Int類(lèi)型的函數(shù),賦值給get2,最后調(diào)用get2(),即內(nèi)部函數(shù)add(),得到函數(shù)調(diào)用的結(jié)果
如果打印三次:print(get2())

結(jié)果: 109 214 319

說(shuō)明每次都捕獲了上下文常亮
如果這是個(gè)定義了get3;

        let get3 =    bibao2(number: 10,number11: 10)
        print(get3())

輸出結(jié)果:24
說(shuō)明新的閉包實(shí)例,回創(chuàng)建新的獨(dú)立的num5,閉包和實(shí)例之間建立一個(gè)強(qiáng)引用環(huán)

自動(dòng)閉包

var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
print(customersInLine.count)
// Prints "5"
 
let customerProvider = { customersInLine.remove(at: 0) }
print(customersInLine.count)
// Prints "5"
 
print("Now serving \(customerProvider())!")
// Prints "Now serving Chris!"
print(customersInLine.count)
// Prints "4"

盡管 customersInLine 數(shù)組的第一個(gè)元素以閉包的一部分被移除了,但任務(wù)并沒(méi)有執(zhí)行直到閉包被實(shí)際調(diào)用。
如果閉包永遠(yuǎn)不被調(diào)用,那么閉包里邊的表達(dá)式就永遠(yuǎn)不會(huì)求值。注意 customerProvider 的類(lèi)型不是 String 而是 () -> String ——一個(gè)不接受實(shí)際參數(shù)并且返回一個(gè)字符串的函數(shù)

同理
當(dāng)你傳一個(gè)閉包作為實(shí)際參數(shù)到函數(shù)的時(shí)候,你會(huì)得到與延遲處理相同的行為。

// customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: () -> String) {
    print("Now serving \(customerProvider())!")
}
serve(customer: { customersInLine.remove(at: 0) } )
// Prints "Now serving Alex!"

傳遞一個(gè)形式參數(shù)為customer,類(lèi)型為函數(shù)() 的函數(shù){ customersInLine.remove(at: 0) }作為實(shí)際參數(shù)給save函數(shù),返回一個(gè)字符串

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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