async / await в Xcode 13 Swift Playground

Я пытаюсь запустить эту асинхронную функцию на игровой площадке Xcode:

      import Foundation
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

enum NetworkingError: Error {
    case invalidServerResponse
    case invalidCharacterSet
}

func getJson() async throws -> String {
        let url = URL(string:"https://jsonplaceholder.typicode.com/todos/1")!
        let (data, response) = try await URLSession.shared.data(from: url)
        
        guard let httpResponse = response as? HTTPURLResponse,
              httpResponse.statusCode == 200 else {
                  throw NetworkingError.invalidServerResponse
              }
        
        guard let result = String(data: data, encoding: .utf8) else {
            throw NetworkingError.invalidCharacterSet
        }
        
        return result
}
    
let result = try! await getJson()
print(result)

и я получаю это сообщение об ошибке:

      error: ForecastPlayground.playground:27:25: error: 'async' call in a function that does not support concurrency
let result = try! await getJson()
                        ^

Итак, я попытался создать асинхронный блок в моем вызове функции:

      async{
    let result = try! await getJson()
    print(result)
}

А потом я получил это сообщение об ошибке:

      Playground execution failed:

error: ForecastPlayground.playground:27:1: error: cannot find 'async' in scope
async{
^~~~~

Я попытался аннотировать свою функцию с помощью нового атрибута @MainActor, но это не сработало.

Что я делаю не так?

4 ответа

Решение

Добавить импорт в UIKit или же SwiftUIна вершине. Похоже, что часть параллелизма стандартной библиотеки не импортируется по умолчанию в данный момент в Swift.

Там является модуль разработки под названием _Concurrency, но здесь доступно только старое подмножество функций (вероятно, из более старого моментального снимка разработки). Однако кажется, что UI-фреймворки Apple полностью раскрывают все новейшие функции параллелизма.

В итоге

      import UIKit

или же

      import SwiftUI

Он также поставляется с

      import SwiftUI

Для Xcode 13 использовать asyncа также awaitв Playground просто импортируйте Foundation и оберните код в отдельную задачу.

      import Foundation

Task.detached {
    func borat() async -> String {
        await Task.sleep(1_000_000_000)
        return "great success"
    }

    await print(borat())
}

И это потому, что ваш код может вызывать асинхронные функции только в трех местах: (1) в теле асинхронной функции или свойства; (2) в статике main()метод класса, структуры или перечисления, помеченный @main; (3) в отдельной дочерней задаче.

быстрая версия
в Терминале.

async/await - Swift 5.5

Другие вопросы по тегам