<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                閉包是?包含的函數代碼塊,可以在代碼中被傳遞和使?。 Swift 中的閉包與 C 和Objective-C 中的代碼塊(blocks)以及其他?些編程語?中的 lambdas 函數?較相似。 閉包可以捕獲和存儲其所在上下?中任意常量和變量的引?。 這就是所謂的閉合并包裹著這些常量和變量,俗稱閉包。Swift 會為您管理在捕獲過程中涉及到的所有內存操作。 在函數 章節中介紹的全局和嵌套函數實際上也是特殊的閉包,閉包采取如下三種形式之?: 全局函數是?個有名字但不會捕獲任何值的閉包 嵌套函數是?個有名字并可以捕獲其封閉函數域內值的閉包 閉包表達式是?個利?輕量級語法所寫的可以捕獲其上下?中變量或常量值的匿名閉包 Swift 的閉包表達式擁有簡潔的?格,并?勵在常?場景中進?語法優化,主要優化如下: 利?上下?推斷參數和返回值類型 隱式返回單表達式閉包,即單表達式閉包可以省略 return? 關鍵字 參數名稱縮寫 尾隨(Trailing)閉包語法 1、閉包表達式 (1)先看一下自帶的sort函數 Swift 標準庫提供了名為 sort? 的函數,會根據您提供的?于排序的閉包函數將已知類型數組中的值進?排序。 ?旦排序完成, sort(_:)? ?法會返回?個與原數組??相同,包含同類型元素且元素已正確排序的新數組。原數組不會被 sort(_:)? ?法修改。 ~~~ let strs = ["ashdif", "gsdfao", "dsdokfn", "csddf"] func compare(str1 : String, str2 : String) -> Bool { return str1 > str2 } var newStrs = strs.sort(compare) print(strs) print(newStrs) //["ashdif", "gsdfao", "dsdokfn", "csddf"] //["gsdfao", "dsdokfn", "csddf", "ashdif"] ~~~ (2)閉包表達式語法 閉包表達式語法有如下?般形式: ~~~ { (parameters) -> returnType in statements } ~~~ 閉包表達式語法可以使?常量、變量和 inout? 類型作為參數,不提供默認值。 也可以在參數列表的最后使?可變參數。 元組也可以作為參數和返回值。 ~~~ let strs = ["ashdif", "gsdfao", "dsdokfn", "csddf"] func compare(str1 : String, str2 : String) -> Bool { return str1 > str2 } var newStrs = strs.sort(compare) print(strs) print(newStrs) var newStrs1 = strs.sort({(str1 : String, str2 : String) -> Bool in return str1 < str2 }) print(newStrs1) //["ashdif", "gsdfao", "dsdokfn", "csddf"] //["gsdfao", "dsdokfn", "csddf", "ashdif"] //["ashdif", "csddf", "dsdokfn", "gsdfao"] ~~~ (3)根據上下文推斷類型 ~~~ let strs = ["ashdif", "gsdfao", "dsdokfn", "csddf"] func compare(str1 : String, str2 : String) -> Bool { return str1 > str2 } var newStrs = strs.sort(compare) print(strs) print(newStrs) var newStrs1 = strs.sort({(str1 : String, str2 : String) -> Bool in return str1 < str2 }) print(newStrs1) var newStrs2 = strs.sort({str1, str2 in return str1 > str2}) print(newStrs2) //["ashdif", "gsdfao", "dsdokfn", "csddf"] //["gsdfao", "dsdokfn", "csddf", "ashdif"] //["ashdif", "csddf", "dsdokfn", "gsdfao"] //["gsdfao", "dsdokfn", "csddf", "ashdif"] ~~~ (4)單表達式閉包隱式返回 單?表達式閉包可以通過隱藏 return? 關鍵字來隱式返回單?表達式的結果 ~~~ var newStrs2 = strs.sort({str1, str2 in str1 > str2}) ~~~ (5)參數名稱縮寫 Swift ?動為內聯函數提供了參數名稱縮寫功能,您可以直接通過 $0? , $1? , $2? 來順序調?閉包的參數。 如果您在閉包表達式中使?參數名稱縮寫,您可以在閉包參數列表中省略對其的定義,并且對應參數名稱縮寫的類型會通過函數類型進?推斷。? in? 關鍵字也同樣可以被省略,因為此時閉包表達式完全由閉包函數體構成: ~~~ var newStrs2 = strs.sort({ $0 > $1}) ~~~ (6)運算符函數 實際上還有?種更簡短的?式來撰寫上?例?中的閉包表達式。 Swift 的 String? 類型定義了關于?于號 ( >? ) 的字符串實現,其作為?個函數接受兩個 String? 類型的參數并返回 Bool? 類型的值。 ~~~ var newStrs2 = strs.sort(>) ~~~ 2、尾隨閉包 如果您需要將?個很?的閉包表達式作為最后?個參數傳遞給函數,可以使?尾隨閉包來增強函數的可讀性。 尾隨閉包是?個書寫在函數括號之后的閉包表達式,函數?持將其作為最后?個參數調?。 ~~~ var newStrs3 = strs.sort() {$0 > $1} ~~~ ~~~ let hanzi = [0 : "零", 1 : "壹", 2 : "貳", 3 : "叁", 4 : "肆", 5 : "伍", 6 : "陸", 7 : "柒", 8 : "捌", 9 : "玖"] let numbers = [23342, 832, 976] let numbersHZ = numbers.map() { (var number) -> String in var outHZ = "" while number > 0 { outHZ = hanzi[number % 10]! + outHZ number /= 10 } return outHZ } print(numbers) print(numbersHZ) //[23342, 832, 976] //["貳叁叁肆貳", "捌叁貳", "玖柒陸"] ~~~ 再來一個簡單的例子: ~~~ func trailingClosure(a : Int, b : Int, c : (Int, Int) -> Bool) -> Int{ if c(a, b) { return a }else { return b } } let result = trailingClosure(10, b: 13) {//我的理解,簡單來說就是寫在括號外面,看著好看 $0 > $1 } print(result) //13 ~~~ 3、捕獲值 閉包可以在其定義的上下?中捕獲常量或變量。 即使定義這些常量和變量的原域已經不存在,閉包仍然可以在閉包函數體內引?和修改這些值。 Swift最簡單的閉包形式是嵌套函數,也就是定義在其他函數的函數體內的函數。 嵌套函數可以捕獲其外部函數所有的參數以及定義的常量和變量。 ~~~ //求一個數x的y次方 func makecalculate(x : Int, y : Int) -> () -> Int { var ret = 1 func achieve() -> Int { for var i = 0; i < y; i++ { //捕獲參數y ret *= x //捕獲變量ret和參數y } return ret } return achieve } let achiveFunc = makecalculate(3, y: 4) print(achiveFunc()) //81 ~~~ achieve函數并沒有任何參數,但是在函數體內訪問了 ret 和 x , y 變量。這是因為其通過捕獲在包含它的函數體內已經存在的 ret 和 x , y 變量的引?(reference)?實現。捕捉了變量引?,保證了 ret 和 x, y 變量在調?完 makecalculate? 后不會消失,并且保證了在下?次執? achieve 函數時, ret 可以繼續增加。 4、閉包是引用類型 ?論您將函數/閉包賦值給?個常量還是變量,您實際上都是將常量/變量的值設置為對應函數/閉包的引?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看