Swift延迟加载的一种用途
有以下一种情况: 我们试图用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修饰的属性初始化代码只会被运行一次,无论你访问该属性多少次! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |