Swift 游乐场 async/await "cannot find 'async' in scope"

Swift Playground with async/await "cannot find 'async' in scope"

我正在尝试 运行 在 Xcode Playground 上使用这个异步函数:

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 属性注释我的函数,但它不起作用。

我做错了什么?

添加对 _Concurrency 的导入(下划线,因为这应该默认包含)或使用该库的库,例如 UIKitSwiftUI。 Swift Playgrounds 目前似乎无法访问所有并发功能,例如 async let.

总结

import _Concurrency

对于 Xcode 13,要在 Playground 中使用 asyncawait,只需导入 Foundation 并将代码包装在一个分离的任务中。

import Foundation

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

    await print(borat())
}

这是因为您的代码只有 3 个地方可以调用异步函数:(1) 在异步函数的主体中或 属性; (2) 在标有@main的class、结构或枚举的静态main()方法中; (3) 在分离的子任务中。