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
Для 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) в отдельной дочерней задаче.