Ваш метод windowDidLoad
содержит следующую строку:
speechSynth?.delegate = self
Это означает, что объект синтезатора речи имеет ссылку на ваш MainWindowController
, поэтому объект синтезатора речи может отправлять сообщения на ваш MainWindowController
.
Упрощенная реализация внутри NSSpeechSynthesizer
может выглядеть примерно так в Swift:
class NSSpeechSynthesizer: NSSoundDelegate {
weak var delegate: NSSpeechSynthesizerDelegate?
func startSpeaking(_ string: String) {
guard
let audioData = audioData(for: string),
let sound = NSSound(data: audioData)
else { return }
sound.delegate = self
sound.play()
}
// Part of NSSoundDelegate
func sound(_ sound: NSSound, didFinishPlaying finished: Bool) {
// The first ? means Swift only sends the message if
// delegate is not nil.
// The second ? means Swift only sends the message if delegate
// implements speechSynthesizer(_:didFinishSpeaking:).
delegate?.speechSynthesizer?(self, didFinishSpeaking: finished)
}
}
Но на самом деле это реализовано в Objective-C, где вам нужно быть более подробным о проверке,делегат обрабатывает сообщение:
- (void)sound:(NSSound *)sound didFinishPlaying:(BOOL)finished {
if ([delegate respondsToSelector:@selector(speechSynthesizer:didFinishSpeaking:)]) {
[delegate speechSynthesizer:self didFinishSpeaking:finished];
}
}