逃逸闭包不可
mutating func doSome() {
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.name = "结构体改变成员变量"
}
}
0.逃逸闭包.jpg
上面代码会报错:“Escaping closure captures mutating 'self' parameter”
逃逸闭包不可修改 的self这个参数。
当self是结构体或枚举实例时,逃逸闭包不能捕获此self。
如果self是一个类的实例,则逃逸闭包能捕获self。
如果只是普通闭包则能捕获所有类型的self。
项目中使用场景
使用某个类(struct或者class)进行网络请求,并将请求结果赋值给该类的一个属性。
1.使用struct
struct AYWorkHomeViewModel: LSConvertable {
var page: Int = 1
var pageSize: Int = 10
var result: LSModel?
func getWorkHomeOrders(finishCallBack: @escaping NetCompleteCallBack) {
let dict = self.convertToDict()
LSNetManager.GET(path: "auntNeedList", parameters: dict, serverType: .apis) { (netResModel, netError) in
self.result = netResModel
}
}
上面的代码中self.result = netResModel是会报错的。
2.使用class
class AYWorkHomeViewModel: LSConvertable {
var page: Int = 1
var pageSize: Int = 10
var result: LSModel?
func getWorkHomeOrders(finishCallBack: @escaping NetCompleteCallBack) {
let dict = self.convertToDict()
LSNetManager.GET(path: "auntNeedList", parameters: dict, serverType: .apis) { (netResModel, netError) in
self.result = netResModel
}
}
上面的代码中self.result = netResModel是不会报错的。
网友评论