2

URL リクエストを作成し、それを async let バインディングに渡したいのですが、これは私には自然なことのように思えます。

func test() async {
    // Force unwraps (!) are just for demo
    var request = URLRequest(url: URL(string:"https://stackoverflow.com")!)
    request.httpMethod = "GET" // just for example
    // some more tinkering with `request` here.
    
    //  Error on this line: "Reference to captured var 'request' in concurrently-executing code"
    async let responseData = URLSession.shared.data(for: request).0
    
    // It works like this:
    // let immutableRequest = request
    // async let responseData = URLSession.shared.data(for: immutableRequest).0
    
    // other stuff
    print("Response body: \(String(data: try! await responseData, encoding: .utf8))")
}

エラーが発生するのはなぜですか? URLRequest構造体であるため、関数に渡すと、関数はその構造体のコピーを取得する必要があるためrequest、非同期呼び出しの後に変更しても、呼び出しに影響することはありません。

呼び出しが非同期で行われることはわかっていますが、呼び出しの時点でパラメーターをキャプチャし、呼び出しが行われたかのように実行を継続することを期待します (したがって、request呼び出しの時点でのコピーが渡されましたdata(for: request).

letまた、次のように、別の変数を作成せず、クロージャーを使用して初期化せずにそれを行う便利な方法はありますかrequest?

let request: URLRequest = {
    var result = URLRequest(url: URL(string:"https://stackoverflow.com")!)
    result.httpMethod = "GET"
    return result
}()
4

1 に答える 1