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 何かを行う場合、その関数自体も非同期である必要があります。

つまり、あらゆる場所のすべてが最終的に非同期にならなければならないということですよね?

いいえ。解決策は、呼び出し関数を でラップすることです。これは、この非常に役立つ WWDC ビデオasync { }を見て学んだことです。

したがって、良いコードは次のようになります。

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{} を実行するときと少し似ていますが、すぐにブロックを非同期で実行するようにスケジュールします。したがって、上記の修正されたコードでは、下部の print ステートメントが、その上の async ブロックの前に実行される可能性があります。

于 2021-06-10T16:34:56.173 に答える