Оператор печати не работает должным образом в iPad Playgrounds

Я пытаюсь запустить простой код, который печатает «foo» внутри асинхронного замыкания с помощью iPad Playgrounds:

import Foundation
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    print("foo")
}

но он не может показать «foo» в средстве просмотра (появляется небольшой встроенный блок с изменяемым размером).

Странно,

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    print("foo")
    let _ = 0
}

работает. Что случилось? Это ошибка?

Кроме того, есть ли способ показать консоль с выводом на печать, как в Xcode Playgrounds? Я нахожу маленькие «зрители» немного громоздкими в использовании.

Заранее спасибо!

РЕДАКТИРОВАТЬ: я проверил, что Xcode Playgrounds показывает () с первым кодом в средстве просмотра и правильно показывает «foo» с добавлением let _ = 0. Тем не менее, я вижу вывод "foo" в обоих случаях, так как у меня есть консольный вывод в версии Xcode.


person Jay Lee    schedule 14.08.2019    source источник


Ответы (1)


На ваш вопрос о консоли cmd + shift + Y вызовет область консоли, как и в любом проекте Xcode.

К вашему более широкому вопросу о том, что происходит...

Замыкание, которое принимает параметр execute: функции asyncAfter, имеет тип () -> Void. Таким образом, замыкание возвращает Void, который typedef'ed в пустой кортеж (). Таким образом, средство просмотра отображает возвращаемое значение замыкания, пустой кортеж.

person EGMSSE    schedule 14.08.2019
comment
@JayLee Ааа, извините, я пропустил, что вы были на игровой площадке iPad. Эта ссылка предлагает метод чтобы вы могли встроить средство просмотра. Не уверен, что есть полная консоль отладки. - person EGMSSE; 14.08.2019
comment
Хорошо, я только что увидел обновление. Теперь я понимаю, почему Playground показывает (). Но тогда в чем разница между первым и последующим кодом? Почему Playground не показывает постоянное значение? - person Jay Lee; 16.08.2019
comment
Моя интуиция подсказывает, что это связано с ARC. Я подозреваю, что закрытие сохраняется, когда вы определяете переменную. Используемый вами метод aSync определяет его закрытие как @autoescaping, что, как я полагаю, означает, что он освобождается после вызова метода. Поэтому, когда вы определяете переменную внутри замыкания, это увеличивает ее счетчик ссылок, что приводит к ее сохранению. Хотя это всего лишь гипотеза, еще не проверял. - person EGMSSE; 16.08.2019