Swift闭包(一):基础篇

Swift闭包和OC中block很类似,是一段自包含的函数代码块,可以在代码中使用和传递。相当于一个匿名函数

闭包写法和演变过程

通过一个例子来说明这个问题:

func testClosure(value: Int, paramFunc: (Int) -> Int) -> String {
    return String(paramFunc(value))
}

这段事例代码再简单不过了,不过我这里还是要说明下testClosure这个函数下的paramFunc参数,这个参数的类型是(Int) -> Int(是一个返回Int,参数是Int的函数)。

最原始写法

既然paramFunc参数需要传一个(Int) -> Int类型函数,那么就写一个函数作为参数传递,这种写法的好处就是,这个函数不仅可以在这里当参数传递,还可以在其它地方使用。

func aa(v: Int) -> Int {
    return v
}
testClosure(value: 10, paramFunc: aa)

闭包写法

  • 闭包完整写法
testClosure(value: 10, paramFunc: { (v: Int) -> Int in
    return v * 10
})
  • 尾随闭包,如果闭包是函数的最后一个参数,闭包参数可以写在参数括号外。
testClosure(value: 10) { (v: Int) -> Int in
    return v * 10
}
  • 闭包的一些简写方式 (无论是否是尾随闭包都可以根据下面的规则进行简写,我这里只给出了尾随闭包的省略写法实例)
    1. Swift可以根据上下文推理参数和返回值类型,这样返回值类型和参数类型可以省略不写。
    2. 如果闭包主体中是单行语句,单行语句计算结果会隐式地返回,return关键字可以省略。
    3. 参数和in可以去掉,闭包的参数可以通过位置来访问
// 自动推导返回值类型,参数类型
testClosure(value: 10) { v in
    return v * 10
}

// return 省略了
testClosure(value: 10) { v in
    v * 10
}

// 注意与函数的区别,函数是有func修饰的,而这里长的很想函数,其实不是函数,而是在调用函数
testClosure(value: 10) {
    $0 * 10
}

你可能感兴趣的:(Swift闭包(一):基础篇)