NSSpeechSynthesizerDelegate

NSSpeechSynthesizerDelegate

我正在做一个编码练习,我很好奇在使用委托时,所有的东西是如何一起工作的。在没有从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编译器会发出警告。

10-08 02:42