Есть ли различия между соответствием и понижением в отношении делегирования свойств? - PullRequest
0 голосов
/ 08 мая 2018

Я работал над упражнением по кодированию, и мне было любопытно, как все работает вместе при использовании делегатов. Не получая никаких ошибок компиляции из Xcode, я смог удалить соответствие класса NSSpeechSynthesizerDelegate и установить свойство делегата, используя downcasting или ключевое слово «as». Если это работает, то каковы плюсы и минусы составления класса таким образом?

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 голосов
/ 08 мая 2018

Если вы удалите соответствие протокола и просто условно приведете speechSynth.delegate = self as? NSSpeechSynthesizerDelegate, он скомпилируется, но это установит delegate в nil во время выполнения, даже , если вы реализуете все необходимые методы .

Вы должны принять NSSpeechSynthesizerDelegate, чтобы это сработало. Конечно, это также в ваших интересах, потому что компилятор Swift затем предупредит вас, если вы пропустили какие-либо обязательные методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...