Swift闭包

2020-06-19  本文已影响0人  奔跑的鸿
in关键字的目的是便于区分返回值和执行语句
{
 (参数) -> 返回值类型 in
 执行语句
 }

一般形式:{
 (parameters) -> returnType in
 statements
 }

完整写法:

let say:(String) -> Void = {
    (name: String) -> Void in
    print("hello \(name)")
}
say("HaRi")

当然以上可省略say右边的闭包类型

let say = {
    (name: String) -> Void in
    print("hello \(name)")
}
say("HaRi")

有多个参数,且有返回值的写法

let calAdd:(Int,Int)->(Int) = {
    (a:Int,b:Int) -> Int in
    return a + b
}
print(calAdd(100,150))

Swift可以根据闭包上下文推断参数和返回值的类型,所以上面的例子可以简化如下

let calAdd2:(Int,Int)->(Int) = {
    (a,b) in
    return a + b
}
print(calAdd2(150,100))

以上当参数类型省略时,参数的括号也可一并省去,如:

let calAdd2:(Int,Int)->(Int) = {
    a,b in
    return a + b
}

单行表达式闭包可以隐式返回,如下,省略return

let calAdd3:(Int,Int)->(Int) = {(a,b) in a + b}
print(calAdd3(50,200))

如果闭包没有参数,可以直接省略“in”

let calAdd4:()->Int = {return 100 + 150}
print("\(calAdd4())")

如果闭包既没有参数也没返回值,可以把return和in都省略

let calAdd5:()->Void = {print("我是250")}
calAdd5()
var array = ["1","100","hi","hello"]
//自动闭包只有一句表达式时,既可以省略闭包类型:"(参数) -> 返回值类型 in",又可以省略return
let removeBlock = {array.remove(at: 3)}
/**它实际上等价于
let removeBlock = {
    () -> Any in
    return array.remove(at: 3)
}
*/
print(array.count) // 4

print("执行代码块移除\(removeBlock())")
print(array.count) // 3
上一篇 下一篇

猜你喜欢

热点阅读