Open4

Swift 5.6以下で戻り値のないasync関数を作る

kitwtnbkitwtnb

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

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