每日一问18——swift基础(04)及后续补充
2017-09-28 本文已影响6人
巫师学徒
swift中的闭包
闭包的定义
先回忆oc中的block语法,详细可以回顾每日一问01——block
/*返回类型 (^名字)(参数列表)*/
void (^Block)(int a)
而在swift中闭包类型的格式:
(参数列表)->(返回类型)
(num :Int) -> () //不填默认为void
我们可以指定任何参数或变量为闭包类型
var block : (()->())?
闭包的使用
我们模拟一个异步请求的过程,通过闭包将结果返回出来。
func loadData(_ callBack : @escaping (_ jsonData : String) ->()) -> Void {
//发送异步请求
DispatchQueue.global().async {
Thread.sleep(forTimeInterval: 1.0)
DispatchQueue.main.async {
callBack("json 数据")
}
}
}
外部调用该函数时的写法
httpTools?.loadData({ (jsonData : String) in
print(jsonData)
})
当闭包是最后一个参数时,我们还有另外一种写法,叫尾随闭包
httpTools?.loadData() { (jsonData : String) in
print(jsonData)
}
可以看到,实际上这种写法就是把{}代码块放在了函数调用后面。
解决循环引用
在swift中解决循环引用的写法非常简单,我们依然可以使用weak关键字,除此之外我们还可以使用unowned关键字,但需要注意使用unowned必须保证被声明的对象不被释放,否则会产生野指针
httpTools?.loadData({[weak self] (jsonData : String) in
self?.view.backgroundColor = UIColor.red
print(jsonData)
})
httpTools?.loadData({[unowned self] (jsonData : String) in
self.view.backgroundColor = UIColor.red
print(jsonData)
})
写法上,最简单就是在括弧最前面加上[关键字 object]来指定对象弱引用。
懒加载
与oc的设计理念相似,swift也希望开发使用懒加载的方式进行加载
- 用到时再加载
- 多次使用只加载一次
swift懒加载的格式
lazy var 变量: 类型 = 创建代码
lazy var 变量: 类型 ={创建变量代码}()
两种格式都能创建懒加载变量,区分在于格式二可以定义更多的创建步骤。例如
lazy var button : UIButton = UIButton() //创建基本的button对象
lazy var button : UIButton = {//为button设置更多内容
let button = UIButton()
button .setTitle("button", for: .normal)
return button
}()