Проблема в том, что первый символ имеет индекс 0
, поэтому задержка равна .now() + 0.5 * 0
, что упрощается до .now()
.
Добавьте к задержке константу:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5 * Double(index) + 0.5) {
^^^^^^
Это заставит первый символ исчезнуть через 1 секунду.
В качестве альтернативы:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5 * Double(index + 1)) {
Кроме того, использование Timer
здесь может быть более подходящим, если вашТекст длинный, как сказал Роб в комментариях.
var index = 0
let characterArray = Array(newText)
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
textView.text! += "\(characterArray[index])"
index += 1
if index == characterArray.endIndex {
timer.invalidate()
}
}