💡

Combineで上流でエラーではなくnilとして受け取りたい

2021/08/20に公開

背景

下流からはエラーじゃないと返せないけど、上流ではnilで受け取りたいみたいな。

// このメソッドは変更できない
func get() -> AnyPublisher<String, Error> {
    fatalError()
}

// 呼び出し側では無ければnilとして受け取りたいがこのままだとエラーで返ってくる
get().sink { _ in
    ...
} receiveValue: { str in
    ...
}.store(in: &cancellables)

解決策

mapで型を変換してエラーをreplaceする!

get()
    .map { str -> String? in str }
    .replaceError(with: nil)
    .sink { _ in
        ...
    } receiveValue: { str in
        ...
    }.store(in: &cancellables)

もし他に解決策ありましたら教えてください🙏
お仕事の依頼もお待ちしております!

Discussion