Swift: Closure
19601 ワード
Close Expression Syntax(モジュール式構文)匿名関数なのでfuncというキーワードは使いません. 閉パケットは、inによって区別される
閉パッケージにParameterとReturn Typeはありません
closureは関数名のない匿名関数ですが、匿名関数です.
モジュールは、1レベルのオブジェクトのプロパティに基づいて定数/変数に代入できます.
パラメータ名のみを使用します.
エンクロージャは、関数のパラメータタイプとしてエンクロージャを渡すことができます.
私たちが知っている汎用関数をparameterに渡すこともできますが、次のコードのようにモジュールを渡すこともできます.
トラッキングキャビネット
closer式を関数の最終パラメータとして渡す必要があり、closer式が長い場合は、closureの後続を作成するのに役立つかもしれません.
「後続ディスク」は、
パラメータ値として関数を呼び出すパラメータ値カッコ()に書き込まれるモジュールを「行内クローズ」と呼びます.
パラメータ値でモジュールを渡すのではなく、関数の最後に尾のようにモジュールを追加できます.
1.パラメータが1つのエンクロージャの関数
パラメータにエンクロージャが1つしかない場合、エンクロージャは最初のパラメータであり、最後のパラメータであるため、トレースエンクロージャを使用できます.また、呼び出し構文カッコ()を省略することもできます.
「closure」という名前のArgumentLabelは、後続ディスクでは省略されます.
ただし、複数のパラメータがある場合は、関数呼び出しカッコ()を省略することはできません.
Closer軽量レベルの構文
構文の最適化
closureは3つのIntをパラメータとして受信し,Intタイプを返す.
doSomething 3関数は内部でパラメータとして受け取ったclosureを実行し,パラメータ1,2,3をclosureに渡す.
上記のコードは以下のように削減できます.
パラメータフォーマットと戻りフォーマットは省略できます.
パラメータ名をShortand Arcgument Nameで置き換えると、パラメータ名とinキーを削除できます.
Shortand Arcgument Nameは、パラメータ名の代わりに使用できます.
a -> $0
b -> $1
c -> $2
アクセスする$とindexを表す数字に順番にアクセスできます.
1回しか残っていない場合は、戻るのも省略します
エンクロージャパラメータが最後のパラメータの場合は、後続のエンクロージャで記入します.
()に値がない場合は省略できます
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
}
Reference
この問題について(Swift: Closure), 我々は、より多くの情報をここで見つけました https://velog.io/@jangdev/Swift-Closureテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol