1:闭包表达式
1.1:常规写法

let block2 = { (x: Int, y: Int) -> Int in
    return x + y
}
print(block2(10, 20))

1.2:闭包表达式写法

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}
var reversedNames = names.sorted(by: backward)
或
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )

1.3:根据上下文推断类型

eversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

1.4:单表达式闭包隐式返回

eversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

1.5:参数名称缩写

reversedNames = names.sorted(by: { $0 > $1 } )
Swift 自动为内联函数提供了参数名称缩写功能,您可以直接通过 $0, $1, $2等来顺序调用闭包的参数。
如果您在闭包表达式中使用参数名称缩写,您可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的 类型会通过函数类型进行推断。 in 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成:

2:尾随闭包
如果您需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。 尾 随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。
2.1:常规写法

func addStr(s1:String,s2:String,closure:(String,String)->String)->String{
    return closure(s1,s2);
}
let aa = addStr(s1: "name", s2: "key") { (result, result1) -> String in
    return result + result1
}

2.2:参数名称缩写

let aa = addStr(s1: "Hello", s2: "world", closure: {($0) + ($1)})
2.3:如果闭包函数过长,可以防止括号外边
let aa = addStr(s1: "Hello", s2: "world"){($0) + ($1)}

3:值捕获
闭包可以在其定义的上下文中捕获常量或变量。 即使定义这些常量和变量的原域已经不存在,闭包仍然可以在闭 包函数体内引用和修改这些值。

4: 逃逸闭包
将闭包作为参数传入函数,但在函数返回之后调用这个闭包,我们称该闭包逃离了函数。当声明一个带有闭包参数的函数时,可以将@escaping写在参数类型前面,指明该闭包允许逃离函数

typealias RequestDidFinishedBlock = (_ responseObject: Dictionary<String, Any>) -> Void
func getQueryListAgentWithParameter(parameter: Dictionary<String, String>, completionBlock:@escaping RequestDidFinishedBlock) {
     completionBlock(data)
}

5:属性闭包

var newClientInfo:((String) -> Void)?
if let newClientInfo = newClientInfo {
    newClientInfo("abcdefg")
}

6:自动闭包
自动闭包是一种自动创建的闭包,用于包装传递给函数作为参数的表达式。这种闭包不接受任何参数,当它被调用的时候,会返回被包装在其中的表达式的值。使用@autoclosure作为标识符

func logIfTrue(_ predicate:@autoclosure () -> Bool) {
    if predicate() {
        print("true")
    }
}
使用:logIfTrue(2>1)

7:闭包的循环引用

使用[weak self]
OcssSocketAdapter.sharedInstance.newClientInfo = { [weak self] (model) in
    if let strongSelf = self {
        strongSelf.clientModel = model
    }
}