日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift-闭包

發(fā)布時間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift-闭包 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
//: Playground - noun: a place where people can playimport UIKitvar str = "Hello, playground" /*在函數(shù) 章節(jié)中介紹的全局和嵌套函數(shù)實際上也是特殊的閉包,閉包采取如下三種形式之一:全局函數(shù)是一個有名字但不會捕獲任何值的閉包嵌套函數(shù)是一個有名字并可以捕獲其封閉函數(shù)域內(nèi)值的閉包閉包表達(dá)式是一個利用輕量級語法所寫的可以捕獲其上下文中變量或常量值的匿名閉包Swift 的閉包表達(dá)式擁有簡潔的風(fēng)格,并鼓勵在常見場景中進(jìn)行語法優(yōu)化,主要優(yōu)化如下:利用上下文推斷參數(shù)和返回值類型隱式返回單表達(dá)式閉包,即單表達(dá)式閉包可以省略return關(guān)鍵字參數(shù)名稱縮寫尾隨(Trailing)閉包語法*///閉包表達(dá)式語法有如下一般形式: /* { (parameters) -> returnType in statements } *///閉包表達(dá)式語法可以使用常量、變量和inout類型作為參數(shù),不提供默認(rèn)值。 也可以在參數(shù)列表的最后使用可變參數(shù)。 元組也可以作為參數(shù)和返回值。 let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]//func backwards(s1: String, s2: String) -> Bool { // return s1 > s2 //} //var reversed = names.sort(backwards)var reversed = names.sort({ (s1: String, s2: String) -> Bool inreturn s1 > s2 })//根據(jù)上下文推斷類型 /*因為排序閉包函數(shù)是作為sort(_:)方法的參數(shù)進(jìn)行傳入的,Swift可以推斷其參數(shù)和返回值的類型。 sorted期望第二個參數(shù)是類型為(String, String) -> Bool的函數(shù),因此實際上String,String和Bool類型并不需要作為閉包表達(dá)式定義中的一部分。 因為所有的類型都可以被正確推斷,返回箭頭 (->) 和圍繞在參數(shù)周圍的括號也可以被省略:*///reversed = names.sort( { s1, s2 in return s1 > s2 } )//單表達(dá)式閉包隱式返回 //單行表達(dá)式閉包可以通過隱藏return關(guān)鍵字來隱式返回單行表達(dá)式的結(jié)果 //reversed = names.sort( { s1, s2 in s1 > s2 } )//參數(shù)名稱縮寫 //Swift 自動為內(nèi)聯(lián)函數(shù)提供了參數(shù)名稱縮寫功能,您可以直接通過$0,$1,$2來順序調(diào)用閉包的參數(shù)。 /*如果您在閉包表達(dá)式中使用參數(shù)名稱縮寫,您可以在閉包參數(shù)列表中省略對其的定義,并且對應(yīng)參數(shù)名稱縮寫的類型會通過函數(shù)類型進(jìn)行推斷。 in關(guān)鍵字也同樣可以被省略,因為此時閉包表達(dá)式完全由閉包函數(shù)體構(gòu)成:*/reversed = names.sort( { $0 > $1 } )//運算符函數(shù) /*實際上還有一種更簡短的方式來撰寫上面例子中的閉包表達(dá)式。 Swift 的String類型定義了關(guān)于大于號 (>) 的字符串實現(xiàn),其作為一個函數(shù)接受兩個String類型的參數(shù)并返回Bool類型的值。 而這正好與sort(_:)方法的第二個參數(shù)需要的函數(shù)類型相符合。 因此,您可以簡單地傳遞一個大于號,Swift可以自動推斷出您想使用大于號的字符串函數(shù)實現(xiàn):*/ reversed = names.sort(>)//尾隨閉包 /*如果您需要將一個很長的閉包表達(dá)式作為最后一個參數(shù)傳遞給函數(shù),可以使用尾隨閉包來增強(qiáng)函數(shù)的可讀性。 尾隨閉包是一個書寫在函數(shù)括號之后的閉包表達(dá)式,函數(shù)支持將其作為最后一個參數(shù)調(diào)用。*/func someFunctionThatTakesAClosure(closure: () -> Void) {// 函數(shù)體部分 }// 以下是不使用尾隨閉包進(jìn)行函數(shù)調(diào)用 someFunctionThatTakesAClosure({// 閉包主體部分 })//注意: 如果函數(shù)只需要閉包表達(dá)式一個參數(shù),當(dāng)您使用尾隨閉包時,您甚至可以把()省略掉 // 以下是使用尾隨閉包進(jìn)行函數(shù)調(diào)用 someFunctionThatTakesAClosure() {// 閉包主體部分 }/* var digitNames = [0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine" ] var numbers = [16, 58, 510]let strings = numbers.map {(var number) -> String invar output = ""while number > 0 {output = digitNames[number % 10]! + outputnumber /= 10}return output } *///捕獲值 /*閉包可以在其定義的上下文中捕獲常量或變量。 即使定義這些常量和變量的原域已經(jīng)不存在,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值Swift最簡單的閉包形式是嵌套函數(shù),也就是定義在其他函數(shù)的函數(shù)體內(nèi)的函數(shù)。 嵌套函數(shù)可以捕獲其外部函數(shù)所有的參數(shù)以及定義的常量和變量*/func makeIncrementor(forIncrement amount: Int) -> () -> Int {var runningTotal = 0func incrementor() -> Int {runningTotal += amountreturn runningTotal}return incrementor } /*注意: 為了優(yōu)化,Swift可能會捕捉和保存一份對值的拷貝,如果這個值是不可變或是在閉包外的。 Swift同樣負(fù)責(zé)被捕捉的所有變量的內(nèi)存管理,包括釋放不被需要的變量。*/ let incrementByTen = makeIncrementor(forIncrement: 10) incrementByTen() incrementByTen()/*如果您創(chuàng)建了另一個incrementor,其會有一個屬于自己的獨立的runningTotal變量的引用。 下面的例子中,incrementBySevne捕獲了一個新的runningTotal變量,該變量和incrementByTen中捕獲的變量沒有任何聯(lián)系*/let incremenSecond = makeIncrementor(forIncrement: 7) incremenSecond() incremenSecond()incrementByTen()/*注意: 如果您將閉包賦值給一個類實例的屬性,并且該閉包通過指向該實例或其成員來捕獲了該實例,您將創(chuàng)建一個在閉包和實例間的強(qiáng)引用環(huán)。 Swift 使用捕獲列表來打破這種強(qiáng)引用環(huán)。更多信息,請參考 閉包引起的循環(huán)強(qiáng)引用。*///閉包是引用類型 /*無論您將函數(shù)/閉包賦值給一個常量還是變量,您實際上都是將常量/變量的值設(shè)置為對應(yīng)函數(shù)/閉包的引用。 上面的例子中,incrementByTen指向閉包的引用是一個常量,而并非閉包內(nèi)容本身。*///如果您將閉包賦值給了兩個不同的常量/變量,兩個值都會指向同一個閉包 let alsoIncrementByTen = incrementByTen alsoIncrementByTen()

總結(jié)

以上是生活随笔為你收集整理的Swift-闭包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。