闭包

 1 swift中闭包的一般形式

 { (参数) ->返回值类型 in

 

  闭包内容

 

 }

 

 2 参数类型

  闭包中的参数可以是 inout类型的,可以使用可变参数(…),元组可以被作为参数和返回值类型

  但不可以有默认值

 

 3 从上下文中进行类型推断

 

 当block被作为参数传递到函数或者是方法中由于类型推断参数和返回值类型 可以

 省去参数的括号"()" 和参数类型 以及返回值”->“ 和返回值类型

 array.sort(by: { a,b in

 

 return a > b

 })

 省去参数类型以及返回值类型仅在作为函数参数时可以省去

 

 4 如果闭包内只有单一语句 如果闭包有返回值则可以省去return关键字

Single-Expression Closures(单一语句 block )

 例如 a >b

 

 array.sort(by: { (a, b) -> Bool in

 

 a>b

 })

 可以省去return关键字 “含蓄的”返回结果

 

5 Trailing Closures

函数最后一个参数为closure,final argument and the closure expression is long

 

1. A trailing closure is written after the function call’s parentheses

 (被写在函数调用时的"()"之后)

 

2.When you use the trailing closure syntax, you don’t write the argument label for the closure as part of the function call.

3.如果一个closure被作为函数唯一的参数,在调用该函数的时候不需要写小括号“()”,比如 array.sorted{ $0 > $1 }

 

6 escaping closure (在创建闭包的上下文之外或者是上下文不存在时 使用闭包 )

 1.在闭包作为函数参数时,如果需要在函数返回之后调用闭包(即异步调用比如网络请求函数)

 需要在参数类型前面加@escaping关键字,否则会报错

 2.在类的函数中如果闭包使用@escaping修饰 ,如果在闭包里需要访问类的属性,则在闭包里边需要明确地引用self

 

7  Autoclosures

 

 1. autoclosure不能带参数,且必须有返回值

 2. 如果closure需要作为autoclosure函数参数 ,需要用关键字@autoclosure

 

8 闭包是引用类型 所以需要避免循环引用 可以使用 Capture List 解决

8.1 swift闭包可以在其定义的上下文中捕获常量(constants) 和变量的值

8.2 swift捕获后可以引用和修改这些值,即使原始定义常量或者变量的scope已经不存在

 

 

 

9 swift中的closure与oc中block区别

swift中的closure在捕获外部变量时可以修改捕获的外部变量,这个与block不同,block捕获外部变量时默认不允许修改,需要添加__block 。

var m = 1

 

let block = { () in 

 

Print(“\(m)”)

 

}

 

m = 5

 

Block() 控制台输出 5 

 

 

 

 

 

 

 

 

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值