我正在做一个编码练习,我很好奇在使用委托时,所有的东西是如何一起工作的。在没有从Xcode获得任何编译错误的情况下,我能够移除类与NSSpeechSynthesizerDelegate的一致性,并使用downcast或关键字“as”设置delegate属性。如果这是可行的,那么用这种方式组成这个类的利弊是什么?
import Cocoa
class MainWindowController: NSWindowController {
@IBOutlet weak var textField: NSTextField!
@IBOutlet weak var speakButton: NSButton!
@IBOutlet weak var stopButton: NSButton!
let speechSynth = NSSpeechSynthesizer()
var isSpeaking: Bool = false {
didSet {
updateButtons()
}
}
override var windowNibName: NSNib.Name? {
return NSNib.Name("MainWindowController")
}
override func windowDidLoad() {
super.windowDidLoad()
updateButtons()
speechSynth.delegate = self as? NSSpeechSynthesizerDelegate
}
// MARK: - Action methods
@IBAction func speakIt(sender: NSButton) {
//Get tuype-in text as a strin
let string = textField.stringValue
if string.isEmpty {
print("string from \(textField) is empty")
} else {
speechSynth.startSpeaking(string)
isSpeaking = true
}
}
@IBAction func stopIt(sender: NSButton) {
speechSynth.stopSpeaking()
isSpeaking = false
}
func updateButtons(){
if isSpeaking {
speakButton.isEnabled = false
stopButton.isEnabled = true
} else {
speakButton.isEnabled = true
stopButton.isEnabled = false
}
}
// MARK: - NSSpeechSynthesizerDelegate
func speechSynthesizer(_ sender: NSSpeechSynthesizer, didFinishSpeaking finishedSpeaking: Bool) {
isSpeaking = false
print("finishedSpeaking = \(finishedSpeaking)")
}
}
最佳答案
如果您移除协议一致性并仅按条件强制转换speechSynth.delegate = self as? NSSpeechSynthesizerDelegate
,它将编译,但这将在运行时将delegate
设置为nil
,即使您实现了所有必需的方法。
你必须采用NSSpeechSynthesizerDelegate
才能起作用。当然,这样做也符合您的最大利益,因为如果您遗漏了任何必需的方法,Swift编译器会发出警告。