Open4
Swift 5.6以下で戻り値のないasync関数を作る
Swiftでasync関数を作る場合、 withCheckedContinuation(function:_:) , withCheckedThrowingContinuation(function:_:) を利用する。
throwsなし
func f1() async {
await withCheckedContinuation { continuation in
continuation.resume()
}
}
throwsあり
func f2() async throws {
try await withCheckedThrowingContinuation { continuation in
continuation.resume()
}
}
throws+戻り値あり
func f3() async throws -> Int {
try await withCheckedThrowingContinuation { continuation in
continuation.resume(returning: 0)
}
}
- Swift 5.6以下を使用
-
withCheckedContinuation(:function:_:)
,withCheckedThrowingContinuation(function:_:)
のクロージャ内に複数行の処理がある - 戻り値がない
これらの条件がそろった場合、ビルド時に Generic parameter 'T' could not be inferred
というエラーが発生する。
func f1() async {
await withCheckedContinuation { continuation in // Generic parameter 'T' could not be inferred
print("")
continuation.resume()
}
}
func f2() async throws {
try await withCheckedThrowingContinuation { continuation in // Generic parameter 'T' could not be inferred
print("")
continuation.resume()
}
}
withCheckedContinuation(:function:_:)
, withCheckedThrowingContinuation(function:_:)
それぞれのクロージャの引数に、CheckedContinuation
という型を明記すればエラーは解消する。
func f1() async {
await withCheckedContinuation { (continuation: CheckedContinuation<Void, Never>) in
print("")
continuation.resume()
}
}
func f2() async throws {
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
print("")
continuation.resume()
}
}
Swift 5.7では型を明記せずともビルドエラーにならなかった。
Swift Playground
おそらく SE-0326 による改善かと思われる。