Swift閉パッケージ_7

4227 ワード

閉パケットは、swiftの閉パケットは、cおよびocのコードブロック匿名関数と比較して類似している、コード内で伝達および使用できる関数ブロックからなる.
閉パッケージは、そのコンテキスト内の任意の変数と定数の参照をキャプチャおよび格納します.これをラップ定数と変数と呼びます.Swiftは、キャプチャ中に関連するすべてのメモリ操作を管理します.
前章で紹介したグローバルおよびネスト関数も実際には特殊な閉パケットであり,閉パケットは以下の3つの形式の1つをとる.
  • グローバル関数は、名前はあるが値は取得されない閉パケット
  • ネストされた関数は、名前が付けられ、その閉じた関数ドメイン値をキャプチャできる閉じたパケット
  • である.
  • 閉パケット式は、そのコンテキスト変数または定数値をキャプチャできる匿名の閉パケット
  • という軽量レベルの構文を用いて書かれている.
    ノーマルクローズ基本式
    //      ,       
            /*
                   ,     ,  
             */
            let b1 = {
                print("      ")
            }
            
            b1()
            
            //      ,    
            /*
                ,  ,   ,       {} 
                      'in'        
             {     ->        in //    }
             
                   ,     ,    ,  ‘in’     
             
             */
            
            let b2 = { (x : Int , y : Int) in
                
                print("         x:\(x)  y:\(y)")
            }
            b2(100, 200)//   b2    ’(‘       
            
            
            //   ,      
            
            let b3 = {(x : Int , y : Int) -> Int in
                
                return x + y
            }
            print(b3(150, 150))
           
    

    閉パッケージ式構文には、次のような一般的な形式があります.
    {(parameters) -> returnType in
        statements
    }
    

    閉パケットの関数体部分には、閉パケットのパラメータと戻り値タイプが定義されたことを示すキーワードinが導入されており、閉パケットの関数体は間もなく開始する
    soretメソッドswift標準ライブラリでは、sorted(by:)という名前のメソッドが提供されています.これは、指定したソートに使用する閉パケット関数に基づいて既知のタイプの配列の値をソートします.ソートが完了すると、sorted(by:)メソッドは、同じタイプのメタが正しくソートされた新しい配列を含む元の配列と同じサイズのメソッドを返します.元の配列はsorted(by:)メソッドによってソートされません.
           let names = ["Chris","Alex","Ewar","Barry", "Daniella"]
            //let sortedNames2 = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )
            let sortedNames = names.sorted { (str1, str2) -> Bool in
                return str1 > str2
            }
            
            print("      \(sortedNames)")
            //result:      ["Ewar", "Daniella", "Chris", "Barry", "Alex"]
    

    コンテキストに基づいてタイプを推定
    ソート閉パケット関数はsorted(by:)メソッドのパラメータとして伝達されるため、swiftはそのパラメータと戻り値のタイプを推定することができ、sorted(by:)メソッドは文字列配列によって呼び出されるため、そのパラメータは(String ,String) -> boolタイプの関数でなければならない.これは、(String,String)およびboolが閉パケット式の定義の一部として必要ないことを意味する.すべてのタイプが正確に推定できるので、戻り矢印->とパラメータの周囲を囲む括弧を省略してもよい
    シングルエクスプレッションクローズドパッケージ暗黙的な戻り
    単行式クローズド・パッケージは、returnを省略することによって使用できます.
    let sortedNames3 = names.sorted { (str1, str2) -> Bool in str1 > str2}
    

    パラメータ名の書き込みswiftは自動的にインライン閉パケットにパラメータ名に書かれた機能を提供し、$0,$1``$2を直接介して閉パケットのパラメータを順番に呼び出すことができます.
    閉パッケージ式でパラメータ名を使用して書かれている場合は、閉パッケージ定義でパラメータリストを省略できます.また、対応するパラメータ名に書かれているタイプは、関数のタイプによって推定されます.inキーワードも同様に省略できます.この場合、閉パッケージ式は完全に閉パッケージ関数体で構成されるためです.
    let sortedNames4 = names.sorted { $0>$1 }
    

    テイルバック
    長い閉パケット式を最後のパラメータとして関数に渡す必要がある場合は、閉パケットの後続を使用して関数の可読性を向上させることができます.関数の最後のパラメータが閉パケットである場合、関数パラメータは事前に終了することができます.最後のパラメータは、閉パケットのコードを直接{}でパッケージします.
    //  
     func endClosure(closure:()->Void) -> Void {
            
            
            print("    ");
            closure()
        }
    
    //    
    //      
            endClosure {
                print("    2")
            }
          
            //       
            endClosure(closure:{
                print("    3")
            } )
    

    値の取得
    閉パケットは、その定義されたコンテキスト内で定数または変数をキャプチャすることができ、これらの定数および変数を定義するユーザの役割ドメインが存在しなくても、閉パケットは閉パケット関数内でこれらの値swiftを参照および変更することができ、値をキャプチャできる閉パケットの最も簡単な形式はネスト関数、すなわち他の関数内で定義された関数である.ネストされた関数は、外部関数のすべてのパラメータで定義された定数と変数をキャプチャします.
    //                 
        func moreFun(oriValue : Int) -> Int {
            
            var count = 10
            
            func inFunc() -> Int{
                
                count += oriValue
                return count
            }
            
            return inFunc()
        }
    

    逃走閉鎖
    オートクローズド