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
}()