我正在进行编码练习,我很好奇在使用代表时一切如何协同工作。在没有从Xcode获得任何编译错误的情况下,我能够删除类与NSSpeechSynthesizerDelegate的一致性,并使用向下转换或关键字'来设置委托属性。如果这有效,那么以这种方式组成课程的利弊是什么?
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)")
}
}
答案 0 :(得分:2)
你删除协议一致性并且只是有条件地转换speechSynth.delegate = self as? NSSpeechSynthesizerDelegate
,它会编译但是会在运行时将delegate
设置为nil
,甚至如果你实现了所有必需的方法。
您必须采用NSSpeechSynthesizerDelegate
才能实现此目的。当然,这样做也符合您的最佳利益,因为如果您遗漏了任何必需的方法,Swift编译器会发出警告。