エンクロージャ
エンクロージャ
きほんキャビネット
public func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]
//정렬할 이름 배열
let names: [String] = ["wizplan", "eric", "yagom", "jenny"]
names
をソートします.func backwards(first: String, second: String) -> Bool {
return first > second
}
//MARK: 매개변수로써의 함수
let reversed: [String] = names.sorted(by: backwards)
//MARK: 매개변수에 클로저 대입
let reversed = names.sorted(by: {(first: String, second: String) -> Bool in
return first > second
})
後続エンクロージャ
//MARK: 후행 클로저 사용
let reversed = names.sorted() { (first: String, second: String) -> Bool in
return first > second
}
//MARK: 후행 클로저 사용 - sorted(by:) 메소드의 소괄호까지 생략 가능
let reversed = names.sorted { (first: String, second: String) -> Bool in
return first > second
}
func doSomething(do: (String) -> Void,
onSuccess: (Any) -> Void,
onFailure: (Error) -> Void) {
// do something...
}
//MARK: 다중 후행 클로저의 사용
doSomething { (something: String) in
//do closure
} onSuccess: { (result: Any) in
//success closure
} onFailure: { (error: Error) in
//failure closure
}
モジュール表示の簡略化
演算子関数は、
//MARK: 문맥 타입유추
let reversed = names.sorted { (first, second) -> Bool in
return first > second
}
//MARK: 단축인자 사용
let reversed = names.sorted {
return $0 > $1
}
//MARK: 암시적 반환 표현
let reversed = names.sorted {
$0 > $1
}
//MARK: 클로저로서의 연산자 함수 사용
let reversed = names.sorted(by: >)
取得値
func makeIncrementer(forIncrement amount: Int) -> (() -> Int) {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
}
let incrementByTwo: (() -> Int) = makeIncrementer(forIncrement: 2)
let first: Int = incrementByTwo()
let second: Int = incrementByTwo()
let thrid: Int = incrementByTwo()
print(first)
print(second)
print(thrid)
---result---
2
4
6
クラスインスタンスにPropertyエンクロージャを割り当てると、そのインスタンスまたはインスタンスメンバーの参照が得られますが、エンクロージャとインスタンスの間に強いループの問題が発生する可能性があります.
エンクロージャは参照タイプです
incrementByTwo
はrunningTotal値の取得によって増加し続けることができる.ディスタンス
탈출(Escape)
として表される.@escaping
キーワードを使用してエンクロージャから飛び出すことを許可することを明記できます.typealias VoidVoidClosure = () -> ()
let firstClosure: VoidVoidClosure = {
print("Closure A")
}
let secondClosure: VoidVoidClosure = {
print("Closure B")
}
//first, second 매개변수 클로전느 함수의 반환 값으로 사용될 수 있으므로 탈출 클로저.
func returnOneClosure(first: @escaping VoidVoidClosure, second: @escaping VoidVoidClosure, shouldReturnFirstClosure: Bool) -> VoidVoidClosure {
return shouldReturnFirstClosure ? first : second
}
//함수에서 반환한 클로저가 함수 외부의 상수에 저장됨.
let returnedClosure: VoidVoidClosure = returnOneClosure(first: firstClosure, second: secondClosure, shouldReturnFirstClosure: true)
returnedClosure()
var closures: [VoidVoidClosure] = []
//closure 매개변수 클로저는 함수 외부의 변수에 저장될 수 있으므로 탈출 클로저.
func appendClosure(closure: @escaping VoidVoidClosure) {
closures.append(closure)
}
self
キーワードを明確に使用する必要があります.func functionWithNoescapeClosure(closure: VoidVoidClosure) {
closure()
}
func functionWithEscapingClosure(completionHandler: @escaping VoidVoidClosure) -> VoidVoidClosure {
return completionHandler
}
class SomeClass {
var x = 10
func runNoescapeClosure() {
functionWithNoescapeClosure { x = 200}
}
func runEscapingClosure() -> VoidVoidCLosure {
return functionWithEscapingClosure { self.x = 100}
}
}
let instance = SomeClass()
instance.runNoescapeClosure()
print(instance.x) // 200
let returnedClosure: VoidVoidClosure = instance.runEscapingClosure()
returnedClosure()
print(instance.x) // 100
Reference
この問題について(エンクロージャ), 我々は、より多くの情報をここで見つけました https://velog.io/@gooreum_90/클로저テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol