Вы можете просто использовать AVSpeechSynthesizerDelegate
для этого, и вы можете удалить таймер из вашего кода.
И для использования AVSpeechSynthesizerDelegate
сначала вам нужно подтвердить свой контроллер вида с помощью AVSpeechSynthesizerDelegate
, как показано ниже:
class ViewController: UIViewController, AVSpeechSynthesizerDelegate {
Следующее, что вам нужно добавить
synthesizer.delegate = self
в вашем viewDidLoad
методе.и вам нужно объявить
let synthesizer = AVSpeechSynthesizer()
вне методов и внутри класса.
И вы можете использовать свойство randomElement
, чтобы найти случайный элемент из массива string
.
И ваш окончательный код будет выглядеть так:
import UIKit
import AVFoundation
class ViewController: UIViewController, AVSpeechSynthesizerDelegate {
let string = ["what kind of car do you have?", "do you like the beach?","did you bring a towel?","There are big waves today"]
let synthesizer = AVSpeechSynthesizer()
override func viewDidLoad() {
super.viewDidLoad()
synthesizer.delegate = self
speakToMe()
}
@objc func speakToMe(){
let utterance = AVSpeechUtterance(string: string.randomElement()!)
utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
utterance.rate = 0.1
synthesizer.speak(utterance)
}
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
speakToMe()
}
}
РЕДАКТИРОВАТЬ:
Так как вы используете только 4 элемента в вашем массиве, будет возможность повторять одно и то же предложение много раз, когда вы берете для него случайную строку, так что вы можете добавить еще одну логику, которая предотвратит это.
Обновите вашу speakToMe
функцию, как показано ниже:
@objc func speakToMe(){
var randomStr = string.randomElement()!
while previousStr == randomStr {
randomStr = string.randomElement()!
}
previousStr = randomStr
let utterance = AVSpeechUtterance(string: randomStr)
utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
utterance.rate = 0.1
synthesizer.speak(utterance)
}
И объявите var previousStr = ""
вне функции.