#swift #xcode12 #wwdc #swift5.5
Вопрос:
Я пытаюсь понять, как использовать асинхронность/ожидание на игровой площадке, используя бета-версию Xcode 12.0 / Swift 5.5, но каждый раз получаю ошибку.
Вот весь мой код игровой площадки, который, вероятно, неверен:
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.Ручка
Любое решение было бы отличным!
Ответ №1:
Я все понял!
Таким образом, сделка заключается в том, что все, что вызывает 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.")
}
async
Обертка планирует, чтобы блок внутри выполнялся асинхронно, в ближайшее время — немного похоже на то, когда вы выполняете DispatchQueue.main.async{}. Таким образом, в исправленном коде выше оператор печати внизу, скорее всего, будет выполняться до асинхронного блока над ним.