在代理属性方面,符合性与向下倾斜之间是否存在差异?

时间:2018-05-08 18:17:02

标签: swift cocoa

我正在进行编码练习,我很好奇在使用代表时一切如何协同工作。在没有从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)")
    }
}

1 个答案:

答案 0 :(得分:2)

你删除协议一致性并且只是有条件地转换speechSynth.delegate = self as? NSSpeechSynthesizerDelegate,它会编译但是会在运行时将delegate设置为nil,甚至如果你实现了所有必需的方法。

您必须采用NSSpeechSynthesizerDelegate才能实现此目的。当然,这样做也符合您的最佳利益,因为如果您遗漏了任何必需的方法,Swift编译器会发出警告。