ошибка: Не удалось найти символы: дескриптор номинального типа для Swift.Task.Обработайте попытку асинхронного/ожидания с помощью бета-версии Xcode 12.5 / Swift 5.5

#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{}. Таким образом, в исправленном коде выше оператор печати внизу, скорее всего, будет выполняться до асинхронного блока над ним.