Swift延迟加载的一种用途
2016-04-01 20:28
309 查看
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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语言精要 - Operator(运算符重载)
- Swift语言精要 - 扩展(Extension)
- Swift语言精要 - 属性
- Swift中的指针类型
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- Swift 学习记录(4)
- Swift 笔记
- Swift 2.2发布
- Swift编程基础(四):控制流
- Swift 常用控件的创建
- Swift 协议代理传值(十)
- iOS Swift编程语言
- Swift中集合类型indexOf(Element)提示错误的解决办法
- Swift中集合类型indexOf(Element)提示错误的解决办法
- Swift中集合类型indexOf(Element)提示错误的解决办法
- Swift中的as操作符
- Swift中的as操作符
- Swift中的as操作符
- Swift UISwitch/UIProgressView/UISlider
- swift字符串