Асинхронный режим URLSession не работает в Swift Package

Я пытаюсь выполнить асинхронный сетевой вызов, используя async / await в Swift 5.5, но по какой-то причине он не работает должным образом в моем Swift Package.

      let (data, response) = URLSession.shared.data(for: request)

Приведенная выше строка кода работает на быстрой игровой площадке (запрос здесь является URLRequest), но она не работает внутри моего пакета Swift (с использованием быстрых инструментов версии 5.5)

Сначала ошибка: Type of expression is ambiguous without more context но я понял, что это связано с присвоением кортежа, поэтому я изменил оператор на просто:

      let data = URLSession.shared.data(for: request)

И это дает мне ошибку: Value of type 'URLSession' has no member 'data'

Более того, автозавершение кода Xcode не перечисляет .data (for:) при работе в Swift Package, в отличие от игровой площадки. Для лучшего понимания посмотрите скриншоты ниже.

Swift PackageИгровая площадка

2 ответа

Я провел достаточно исследований и пришел к выводу, что пакет Swift (который создается повсеместно) требует SDK macOS 12.0 для Swift Concurrency, а в текущем выпуске Xcode 13 его нет. Это только в бета-версиях, поэтому мне придется использовать последнюю бета-версию или дождаться, пока Apple объявит о выпуске Xcode, который поддерживает MacOS 12 SDK.

Я удивлен, что вы не заметили ошибку

      expression is 'async' but is not marked with 'await'

Вызов функции URLSession.shared.data(for: request), потому что это async, должен возвращать асинхронное продолжение вместо (Data,URLResponse) кортеж.

У вас будет два способа справиться с этим. Вы могли сразу await ответ, предложенный в комментариях:

      let (data, response) = await URLSession.shared.data(for: request)

или вы могли бы использовать async let чтобы захватить продолжение, а затем вы можете дождаться его позже:

      async let requestTask = URLSession.shared.data(for: request)

print("Doing some other stuff")

let (data, response) = try await requestTask
Другие вопросы по тегам