Swift: Closure

19601 ワード

Close Expression Syntax(モジュール式構文)
  • 匿名関数なのでfuncというキーワードは使いません.
  • 閉パケットは、inによって区別されるClosure HeadおよびClosure Bodyを有する.

  • 閉パッケージにParameterとReturn Typeはありません
    closureは関数名のない匿名関数ですが、匿名関数です.
    モジュールは、1レベルのオブジェクトのプロパティに基づいて定数/変数に代入できます.
        let hello = { () -> () in
            print("Hello")
        }
        hello() // hello
    ParameterとReturn Typeを備えたエンクロージャ
        let hello2 = { (name: String) -> String in
            return "Hello, \(name)"
        }
    parameter Nameは単独で使用されており、Arguemnt LabelとParameter Labelと考えられるが、closureではArgument Labelは使用されない.
    パラメータ名のみを使用します.
        hello2(name: "장일규") // error
        hello2("장일규")
    パラメータ付き関数を呼び出すと、通常の関数を呼び出すように、Argument Labelを書いてパラメータ値を渡すとエラーが発生します.
    エンクロージャは、関数のパラメータタイプとしてエンクロージャを渡すことができます.
        func doSomething(closure: () -> ()) {
            closure()
        } 
    closureはdoSomething関数のパラメータとして定義される.
    私たちが知っている汎用関数をparameterに渡すこともできますが、次のコードのようにモジュールを渡すこともできます.
        doSomething(closure: { () -> () in
            print("closure")
        })
    モジュールは、関数の戻りタイプとして使用できます.
        func doSomething2() -> (Int) -> () {
            return { (age: Int) -> () in
                print("I'M \(age)")
            }
        }
    
        doSomething2()(29)
    上のようにエンクロージャに戻ることもできます.
        let ageClosure: (Int) -> () = doSomething2()
    
        ageClosure(19)
    モジュールを呼び出した場所から受信して実行することもできます.
    トラッキングキャビネット
    closer式を関数の最終パラメータとして渡す必要があり、closer式が長い場合は、closureの後続を作成するのに役立つかもしれません.
    「後続ディスク」は、함수의 인자이면서度、함수 호출 괄호 뒤에 작성度のままです.
        func someFunctionThatTakesAClosure(closure: () -> Void) {
            closure()
        }
    パラメータとして機能するエンクロージャが1つしかない場合、上記のsomeFunctionThatTakesAclosere関数のような関数が呼び出されます.
        // 다음은 이 함수를 '트레일링 클로저'를 사용하지 않고 Inline Closure로 호출하는 방법
    
        someFunctionThatTakesAClosure(closure: {
            // 클로저 본문은 여기에 둔다.
            print("Hello!")
        })
    上のコードはこのように書かれています.
    パラメータ値として関数を呼び出すパラメータ値カッコ()に書き込まれるモジュールを「行内クローズ」と呼びます.
    パラメータ値でモジュールを渡すのではなく、関数の最後に尾のようにモジュールを追加できます.
    1.パラメータが1つのエンクロージャの関数

  • パラメータにエンクロージャが1つしかない場合、エンクロージャは最初のパラメータであり、最後のパラメータであるため、トレースエンクロージャを使用できます.また、呼び出し構文カッコ()を省略することもできます.

  • 「closure」という名前のArgumentLabelは、後続ディスクでは省略されます.
  •     // 다음은 이 함수를 트레일링 클로저로 호출하는 방법
    
        someFunctionThatTakesAClosure() { () -> () in
        // 끝자리 클로저 본문은 여기에 둡니다.
        }
    2.複数のパラメータを持つ関数
        func doSomething2(success: () -> (), fail: () -> ()) {
            // 함수 본문
            success()
            fail()
        }
    上のdoSomething 2関数は、成功と失敗の2つのモジュールをパラメータとする関数です.
        // 다음은 이 함수를 '트레일링 클로저'를 사용하지 않고 Inline Closure로 호출하는 방법
        doSomething2(success: { () -> () in
            print("Success!")
        }, fail: { () -> () in
            print("Fail!")
        })
    上のコードはInline Closureで呼び出されたコードです.
        doSomething2(success: {
            () -> () in
            print("Success!")
        }){ () -> () in
            print("Fail")
        }
    上のコードのように、最後のパラメータのモジュールは関数の後ろに貼って使用できます.
    ただし、複数のパラメータがある場合は、関数呼び出しカッコ()を省略することはできません.
    Closer軽量レベルの構文
    構文の最適化
        func doSomething3(closure: (Int,Int,Int) -> Int) {
            closure(1,2,3)
        }
    doSomething 3関数はパラメータとして閉パッケージを受け入れます.
    closureは3つのIntをパラメータとして受信し,Intタイプを返す.
    doSomething 3関数は内部でパラメータとして受け取ったclosureを実行し,パラメータ1,2,3をclosureに渡す.
        doSomething3(closure: { (a: Int,b: Int,c: Int) -> Int in
            return a+b+c
        })
    上のコールブックはオンライン露光方式で書かれたコードです.
    上記のコードは以下のように削減できます.
    パラメータフォーマットと戻りフォーマットは省略できます.
        doSomething3(closure: { (a, b, c) in
            return a+b+c
        })
    定数タイプ: Intおよびreturn(戻り)タイプIntは省略される.
    パラメータ名をShortand Arcgument Nameで置き換えると、パラメータ名とinキーを削除できます.
    Shortand Arcgument Nameは、パラメータ名の代わりに使用できます.
        doSomething3(closure: {
            return $0 + $1 + $2
        })
    代替パラメータ名
    a -> $0
    b -> $1
    c -> $2
    アクセスする$とindexを表す数字に順番にアクセスできます.
    1回しか残っていない場合は、戻るのも省略します
        doSomething3(closure: {
            return $0 + $1 + $2
        })
    上記のように、コード内部にreturn文が1つしかない場合は、returnキーワードを省略することもできます.
    ```swift
        doSomething3(closure: {
             $0 + $1 + $2
        })
    文を返すコードは省略します.
    エンクロージャパラメータが最後のパラメータの場合は、後続のエンクロージャで記入します.
        doSomething3() {  
            $0 + $1 + $2
        }
    トレーシングエンクロージャを使用すると、パラメータの末尾をエンクロージャに減らすことができます.
    ()に値がない場合は省略できます
    doSomething3 {  
        $0 + $1 + $2
    }