Open1
Swift: async letのBoolean &&
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
という仕組みで右辺の式を自動的にクロージャで囲むというような格好になっているのですね。
今回の例の場合で言うと、result1
がtrue
の場合、result2
(を囲む自動生成クロージャ)は実行されないので、await
からすり抜けてしまうでしょ?だからエラーにしてるんですよ、というような話のようです。
に解消方法が書いてありました。
async let result1: Bool = funcA()
async let result2: Bool = funcB()
let (result1awaited, result2awaited) = await (result1, result2)
let bothOK = result1awaited && result2awaited
のように、result1
と result2
の両方を待つ行を作って、そのあとで評価する、という感じですね。