1

我试图弄清楚如何使用 Xcode 12.0 beta / Swift 5.5 在 Playground 中使用 async/await,但每次都会出错。

这是我的整个操场代码,这可能是错误的:

import Cocoa
import Foundation

if #available(macOS 12.0, *) {
    
    class Foo {
        func reversed(_ s: String) async -> String {
            Thread.sleep(forTimeInterval: 10)
            return String(s.reversed())
        }
    }
    
    detach {
        let foo = Foo()
        let result = await foo.reversed("Chowhound")
        print("Result is \(result)")
    }
}

我收到此错误:

错误:无法查找符号:Swift.Task.Handle 的名义类型描述符

任何解决方案都会很棒!

4

1 回答 1

0

我想到了!

所以交易是任何调用的东西也async必须是异步的。因此,如果您在函数中执行await 任何操作,则该函数本身也必须是异步的。

所以这意味着所有地方的一切都必须以异步方式结束,对吧?

没有。解决方案是将调用函数包装在 中async { },我通过观看这个非常有用的 WWDC 视频了解到这一点

所以好的代码最终是这样的:

import Cocoa
import Foundation

if #available(macOS 12.0, *) {
    
    class Foo {
        func reversed(_ s: String) async -> String {
            Thread.sleep(forTimeInterval: 2)
            return String(s.reversed())
        }
    }
    
    let foo = Foo()
    async {
        let result = await foo.reversed("Chowhound")
        print("Result is \(result)")
    }
    // The above runs asynchronously, and probably won't run before this:
    print("The async block above probably runs after me.")
}

wrap 会安排其中async的块以异步方式运行,很快 - 有点像您执行 DispatchQueue.main.async{} 时。因此,在上面更正的代码中,底部的 print 语句可能会在其上方的 async 块之前运行。

于 2021-06-10T16:34:56.173 回答