Open1

Swift: async letのBoolean &&

kabeyakabeya

Swift Concurrencyを使っていて、async letで複数の結果を受け、最後にawaitでその結果の&&||を取ろうとするとエラーになります。

async let result1: Bool = funcA()
async let result2: Bool = funcB()
let bothOK = await result1 && result2 // エラー: 'async let' in an autoclosure that does not support concurrency

調べて始めて知ったのですが、Swiftの標準の&&||は、右辺の遅延評価を行うために、@autoclosureという仕組みで右辺の式を自動的にクロージャで囲むというような格好になっているのですね。

https://qiita.com/shimesaba/items/b1baced2ec3d9244b2c9

今回の例の場合で言うと、result1trueの場合、result2(を囲む自動生成クロージャ)は実行されないので、awaitからすり抜けてしまうでしょ?だからエラーにしてるんですよ、というような話のようです。

https://forums.swift.org/t/boolean-operators-and-async-let/61354/3

に解消方法が書いてありました。

async let result1: Bool = funcA()
async let result2: Bool = funcB()
let (result1awaited, result2awaited) = await (result1, result2)
let bothOK = result1awaited && result2awaited

のように、result1 result2の両方を待つ行を作って、そのあとで評価する、という感じですね。