初投稿です。@dsxsxsxsです。
ここ最近本格的にCombineを使いはじめました。
割としょうもない話をしたいと思います。
怒られる実装
flatMapNoNo.swift
["hoge"].publisher
.flatMap { _ in
URLSession.shared.dataTaskPublisher(for: URL(string: "https://qiita.com")!)
}
上記コードはなぜか上手く行かず、'flatMap(maxPublishers:_:)' is only available in iOS 14.0 or newer
っとコンパイラーに怒られる。
そんなわけないですよね。
解決案
upstreamにsetFailureType(to:)
を繋いであげれば大丈夫。
flatMapYaYa.swift
["hoge"].publisher
.setFailureType(to: URLError.self)
.flatMap { _ in
URLSession.shared.dataTaskPublisher(for: URL(string: "https://qiita.com")!)
}
どういうこと?
iOS14以降オンリーのメソッドを呼んでしまったからです。
定義がこうなっています:
flatMapFromNeverFail.swift
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
extension Publisher where Self.Failure == Never {
public func flatMap<P>(maxPublishers: Subscribers.Demand = .unlimited, _ transform: @escaping (Self.Output) -> P) -> Publishers.FlatMap<P, Publishers.SetFailureType<Self, P.Failure>> where P : Publisher
}
Failure型がNeverの場合、setFailureType(to:)
を内部でやってくれるflatMap
が追加されましたという。
ちなみに、switchToLatest()
も同様です。🍎さんはいつも通り、さり気なくサプライズを用意してくれます。
switchToLatestFromNeverFail.swift
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
extension Publisher where Self.Failure == Never, Self.Output : Publisher {
public func switchToLatest() -> Publishers.SwitchToLatest<Self.Output, Publishers.SetFailureType<Self, Self.Output.Failure>>
}
どの人たちがよくハマるの?
- XCode12から始めた人
- Rxに慣れた人
- サポートOSバージョンをiOS13指定しまっている人
僕は見事に上記3点フルコンボでした。😅
どの人たちがハマらないの?
- 去年からCombineを始めたトップバッター勢
- そもそもiOS13を切った勢