像这样的事情怎么样:
import UIKit
import AVFoundation
func delay(_ delay:Double, closure:@escaping ()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
class ViewController: UIViewController {
let speechSynthesizer = AVSpeechSynthesizer()
override func viewDidLoad() {
super.viewDidLoad()
speak([("Hello", 5.0), ("Is there anyone there?", 10.0), ("Hello?", 0.0)])
}
func speak(_ phrases: [(phrase: String, wait: Double)]) {
if let (phrase, wait) = phrases.first {
let speechUtterance = AVSpeechUtterance(string: phrase)
speechSynthesizer.speak(speechUtterance)
let rest = Array(phrases.dropFirst())
if !rest.isEmpty {
delay(wait) {
self.speak(rest)
}
}
}
}
}
Notes:
- 元组数组被传递给
speak
。元组对包含要说出的短语以及说出下一个短语之前要等待的延迟。
-
speak
从数组中取出第一项,说出该短语并将数组的其余部分(如果不为空)传递给speak
等待延迟后再次。
-
delay
由@matt 编写,来自here.
由于最后一次延迟没有任何用处,因此您可以将其翻转并在延迟后说出第一个短语。
func speak(_ phrases: [(wait: Double, phrase: String)]) {
if let (wait, phrase) = phrases.first {
delay(wait) {
let speechUtterance = AVSpeechUtterance(string: phrase)
self.speechSynthesizer.speak(speechUtterance)
let rest = Array(phrases.dropFirst())
if !rest.isEmpty {
self.speak(rest)
}
}
}
}
你可以像这样使用这个:
// Wait 5 seconds before starting...
speak([(5.0, "I'm sorry Dave."), (2.0, "I can't do that.")])