iOS開発の迅速なクロージャ

1. クロージャ式の構文

{ (参数) -> return 类型 in
    //内容
}
let names = ["C", "A", "E", "B", "D"]
func back(_ s1: String, s2: String) -> Bool {
    return s1 > s2   //(B > A, C > B)
}
//闭包后: var reversedNames.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 })

 2. コンテキストから型を推測する

reversedNames = names.sorted(by: {s1, s2 in return s1 > s2})
//传入参数的类型确定,: String, : String可省略。传出参数的类型确定: -> Bool可省略

3. 単一式クロージャーの暗黙的な戻り

reversedNames = names.sorted(by: {s1, s2 in s1 > s2})
//只包含一个表达式,省略return之后无歧义,所以可以省略return。

4. パラメータ名の略称

reversedNames = names.sorted(by: {$0 > $1})
//可按照$0, $1, $2顺序调用闭包函数

5. 演算子メソッド

reversedNames = names.sorted(by: >)

6. 後続のクロージャ

パラメータ ラベルを書き出さずに、長いクロージャ式を最後のパラメータとして関数に渡します。

func some(do: () -> Void) {
    //代码
}
//不使用尾随闭包调用函数
some(do: {
    //代码
}
//使用尾随闭包调用函数
some() {
    //语句
}
reversedNames = names.sorted() {$0 > $1}
//sorted为函数的唯一方法时,可省略括号
reversedNames = names.sorted {$0 > $1}

7. 価値の獲得

入れ子関数は、その外側の関数のすべてのパラメーター、変数、および定数をキャプチャできます。

8. クロージャーのエスケープ

クロージャがパラメータとして関数に渡されたが、関数が戻った後にクロージャが実行される場合、これはクロージャ エスケープと呼ばれます。

@escaping アノテーションを付けて、クロージャーがエスケープできるようにします。

var comp: [() -> Void] = []
func some(comp1: @escaping () -> Void) {
    comp.append(comp1)
}

9. 自動閉鎖

 関数に引数として渡される式をラップします。パラメータは取らず、値のみを返します。

 怠惰な評価。このクロージャが呼び出されるまで、コードは実行されません。

var cuL = ["C", "A", "E", "B", "D"]
print(cuL.count)    //5
let cuP = {cuL.remove(at: 0)}
print(cuL.count)    //5。闭包未运行
cuP()     //调用闭包
print(cuL.count)    //4。闭包已运行,第一个值被删除。

おすすめ

転載: blog.csdn.net/LYly_B/article/details/132507192