3

我正在尝试在 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()
                        ^

所以我尝试在我的 func 调用中创建 am async 块:

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

2 回答 2

6

添加导入_Concurrency(下划线,因为这仍然是一个测试版功能)或使用它的库,例如UIKitSwiftUI. 不过,Swift Playgrounds 目前似乎无法访问所有并发功能,例如async let.

总之

import _Concurrency
于 2021-06-16T14:39:07.750 回答
0

对于 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) 在异步函数或属性的主体中;main()(2) 在用 标记的类、结构或枚举的静态方法中@main;(3) 在一个分离的子任务中。

于 2021-12-26T04:39:10.473 回答