大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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修饰的属性初始化代码只会被运行一次,无论你访问该属性多少次!
总结以上是内存溢出为你收集整理的Swift延迟加载的一种用途全部内容,希望文章能够帮你解决Swift延迟加载的一种用途所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)