Swift延迟加载的一种用途

本文探讨了如何使用Swift的懒加载特性解决NSSpeechSynthesizer实例的委托对象设置问题,确保在文本朗读完毕后可以触发特定动作。

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


有以下一种情况:

我们试图用Cocoa的语音合成类NSSpeechSynthesizer来完成对字符串的朗读,这很容易.但是我们还有一个附加条件,就是在朗读完一段文本后触发一个动作.

这貌似也不难,我们只要遵守NSSpeechSynthesizerDelegate协议即可,但是光这样还不行,我们还必须将NSSpeechSynthesizer实例的delegate属性设置为合适的委托对象.

作为一个简单的例子,我们会用一个ViewController来作为NSSpeechSynthesizer的委托对象,所以我们可以这样写:

let speechSythesizer = NSSpeechSythesizer()

override func viewDidLoad() {
        super.viewDidLoad()
        speechSynthesizer.delegate = self
    }

这样很美好,不过非要在viewDidLoad里面赋值委托对象吗?不可以在默认属性中来完成吗?

本猫想了一会,于是有了如下代码:

let speechSynthesizer:NSSpeechSynthesizer = {
        let tmp = NSSpeechSynthesizer()
        tmp.delegate = self
        return tmp
    }()

不幸的是,以上代码不能正确运行,因为其中的self并没有代表ViewController的实例对象.所以此路不通.

所幸的是Swift为我们提供了一种延时加载(又称惰性加载)属性的机制,我们可以这样写:

lazy var speechSynthesizer:NSSpeechSynthesizer = {
        var tmp = NSSpeechSynthesizer()
        tmp.delegate = self
        return tmp
    }()

很好很强大!

需要注意的是lazy修饰的属性初始化代码只会被运行一次,无论你访问该属性多少次!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值