error: Couldn't lookup symbols: nominal type descriptor for Swift.Task.Handle trying async/await with Xcode 12.5 beta / Swift 5.5
error: Couldn't lookup symbols: nominal type descriptor for Swift.Task.Handle trying async/await with Xcode 12.5 beta / Swift 5.5
我正在尝试弄清楚如何使用 Xcode 12.0 beta / Swift 5.5 在 Playground 中使用 async/await,但每次都会出错。
这是我的整个 playground 代码,可能是错误的:
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)")
}
}
我收到这个错误:
error: Couldn't lookup symbols:
nominal type descriptor for Swift.Task.Handle
任何解决方案都会很棒!
我想通了!
所以交易是任何调用 async
的东西本身也必须是异步的。因此,如果您在函数中做 await
任何事情,该函数本身也必须是异步的。
所以这意味着所有地方的一切都必须异步结束,对吗?
没有。解决方案是将调用函数包装在 async { }
中,这是我通过观看 very helpful WWDC video
了解到的
所以好的代码最终是这样的:
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.")
}
async
包装将块内的块异步调度到 运行,很快 - 有点像您执行 DispatchQueue.main.async{} 时的情况。所以在上面更正的代码中,底部的打印语句可能 运行 在它上面的异步块之前。
我正在尝试弄清楚如何使用 Xcode 12.0 beta / Swift 5.5 在 Playground 中使用 async/await,但每次都会出错。
这是我的整个 playground 代码,可能是错误的:
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)")
}
}
我收到这个错误:
error: Couldn't lookup symbols: nominal type descriptor for Swift.Task.Handle
任何解决方案都会很棒!
我想通了!
所以交易是任何调用 async
的东西本身也必须是异步的。因此,如果您在函数中做 await
任何事情,该函数本身也必须是异步的。
所以这意味着所有地方的一切都必须异步结束,对吗?
没有。解决方案是将调用函数包装在 async { }
中,这是我通过观看 very helpful WWDC video
所以好的代码最终是这样的:
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.")
}
async
包装将块内的块异步调度到 运行,很快 - 有点像您执行 DispatchQueue.main.async{} 时的情况。所以在上面更正的代码中,底部的打印语句可能 运行 在它上面的异步块之前。