@H_404_2@大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
@H_404_2@有以下一种情况: @H_404_2@我们试图用Cocoa的语音合成类NSSpeechSynthesizer来完成对字符串的朗读,这很容易.但是我们还有一个附加条件,就是在朗读完一段文本后触发一个动作. @H_404_2@这貌似也不难,我们只要遵守NSSpeechSynthesizerDelegate协议即可,但是光这样还不行,我们还必须将NSSpeechSynthesizer实例的delegate属性设置为合适的委托对象. @H_404_2@作为一个简单的例子,我们会用一个ViewController来作为NSSpeechSynthesizer的委托对象,所以我们可以这样写:
let speechSythesizer = NSSpeechSythesizer()
override func viewDidLoad() {
super.viewDidLoad()
speechSynthesizer.delegate = self
}
@H_404_2@这样很美好,不过非要在viewDidLoad里面赋值委托对象吗?不可以在默认属性中来完成吗?
@H_404_2@本猫想了一会,于是有了如下代码:
let speechSynthesizer:NSSpeechSynthesizer = {
let tmp = NSSpeechSynthesizer()
tmp.delegate = self
return tmp
}()
@H_404_2@不幸的是,以上代码不能正确运行,因为其中的self并没有代表ViewController的实例对象.所以此路不通.
@H_404_2@所幸的是Swift为我们提供了一种延时加载(又称惰性加载)属性的机制,我们可以这样写:
lazy var speechSynthesizer:NSSpeechSynthesizer = {
var tmp = NSSpeechSynthesizer()
tmp.delegate = self
return tmp
}()
@H_404_2@很好很强大!
@H_404_2@需要注意的是lazy修饰的属性初始化代码只会被运行一次,无论你访问该属性多少次!