Swift中闭包,懒加载,单例的写法区别

闭包

闭包的参数和返回值都写在大括号里面,以”in”分隔开闭包内的代码块,如果闭包的参数和返回值都为空的话,”()->() in”就可以省略,下面是几种常见的闭包写法:

最简单的闭包:
//声明一个无参数无返回值的闭包,省略了参数返回值语句
    let simpleClosure = {
        print("呵呵")
    }
    //调用闭包
    simpleClosure()

有参数的闭包声明方法:

方式1

    let callback = { (result: String) -> () in
        print("数据请完成,回调了,数据是 \(result)")
        // 更新 UI
    }

方式2,最外层括号可以前移到闭包名后面

    loadData() { (result) -> () in
        print("数据=\(result)")
    }

方式3

    loadData({ (result) -> () in
        print("数据=\(result)")
    })

懒加载:

在 Swift 中,懒加载本质就是一个闭包,在前面加上lazy关键字,
在需要这个属性的时候,会执行后面的闭包,并且把闭包的返回值记录下来,下次再次使用这个属性的时候,直接返回

懒加载的几种写法:

1.常用写法,可以在懒加载的同时对对象设置一些值

lazy var person: Person = {
    // 初始化 person 并且返回
    let p = Person()
    p.name = "老王"
    print("我要起飞了...")
    return p
}()

2.懒加载最简单的写法

lazy var person3: Person = Person()

3.测试代码,仅供参考

lazy var person2: Person = self.personFunc()

let personFunc = { () -> Person in
    print("我继续起飞~~")
    return Person()
}
把方法3改造一下:
 lazy var person2: Person = { () -> Person in
    print("我继续起飞~~")
    return Person()
}()  

怎么样,是不是眼熟了许多呢~~~

单例

1.常用写法

// 在方法内部不能使用 static 修饰变量
static var onceToken: dispatch_once_t = 0
static var instance: HMSoundTools?
// 在 Swift 单例与懒加载格式差不多
// 把懒加载的 lazy var 改成 static let
static let sharedTools2: HMSoundTools = {
    let instance = HMSoundTools()
    return instance
}()

2.模仿 OC写法

static var onceToken: dispatch_once_t = 0
static var instance: HMSoundTools?
class func sharedTools() -> HMSoundTools {
dispatch_once(&onceToken) { () -> Void in
        instance = HMSoundTools()
    }
   return instance!
}

总结:懒加载与单例的实质都是”无参返回值是对象”的闭包,只不过是在定义闭包的同时就执行并返回对象了(大括号后面跟着的()语句),并且把返回值的类型提取到了等号的左边,可以对照懒加载写法1和单例的改造写法3仔细体会~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值