1

В приведенном примере строка появляется не посимвольно с интервалом в секунду, а вся сразу через 5 секунд

for _ in 1...5 {
    sleep(1) // задержка между появлениями точек
    print(".", terminator: "")
}

print("end");

Как сделать, чтобы текстовый символ (в текущем примере - точка) в консоли появлялся друг за другом в одной строке с некоторой задержкой?

xhr
  • 1,159
  • 9
  • 23
  • 44
  • print(".", separator: "", terminator:"") – Vitali Eller Dec 12 '17 at 11:54
  • где тут задержка между появлением символов? – xhr Dec 12 '17 at 12:58
  • Так у Вас же есть уже эта часть: sleep(1) ? – Vitali Eller Dec 12 '17 at 13:39
  • в примере и terminator есть. Но вопрос совсем в другом. если скопировать код в плейграунд, станет понятно (ну или внимательно прочитать текст) – xhr Dec 12 '17 at 13:52
  • Вы хотите это в playground? – VAndrJ Dec 12 '17 at 19:02
  • да, хочу в консоли выводить в строку символы через некоторый интервал времени – xhr Dec 12 '17 at 19:18
  • да, именно в playground – xhr Dec 13 '17 at 09:36

1 Answers1

2

UPD: С отключением буфера работает корректно в playground, попробуйте:

var counter = 0
setbuf(__stdoutp, nil)
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
    guard counter < 5 else {
        print("End")
        timer.invalidate()
        return
    }
    print(".", terminator: "")
    counter += 1
}
RunLoop.main.run()

Пример кода для playground:

var counter = 0
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
    guard counter < 5 else {
        print("End")
        timer.invalidate()
        return
    }
    print(".", terminator: "")
    counter += 1
}
RunLoop.main.run()

Используем таймер, каждую секунду делаем print и увеличиваем счетчик. Если нужные условия выполнены, прекращаем.

Но проблема в том, что при отработке в playground появляется все сразу по окончании.

. . . . . End

Если убрать terminator и делать только print("."), то точки корректно распечатываются столбиком в консоли.

.
.
.
.
.
End

Если взять этот же код и запустить на симуляторе/устройстве, то отрабатывает корректно:

введите сюда описание изображения

Таким образом, это просто баг в playground. Ваш вариант без terminator тоже отработает в playground, но в программе все повесит на 5 секунд.

VAndrJ
  • 15,791
  • вы переписали код из примера, при этом усложнив его ) Однако, я не знал, что в симуляторе/на девайсе оно работает корректно. Спасибо ) Но, да, нужно каким-то образом получить такое же поведение в плейграунде. – xhr Dec 13 '17 at 09:34
  • @xhr обновил ответ, попробуйте. – VAndrJ Dec 13 '17 at 10:50
  • спасибо, VAndrJ ) – xhr Dec 13 '17 at 14:38