每日一问18——swift基础(04)及后续补充

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
    }()

.....待补充

你可能感兴趣的:(每日一问18——swift基础(04)及后续补充)