title | emoji | type | topics | published | |
---|---|---|---|---|---|
[Swift] [Combine] combineLatest() -> map() は combineLatest() {} で書き直せる |
🌾 |
tech |
|
true |
以下のサンプルコードをみれば、わかると思います。
import Combine
var cancellables = Set<AnyCancellable>()
let pub1 = PassthroughSubject<Int, Never>()
let pub2 = PassthroughSubject<Int, Never>()
let pub3 = PassthroughSubject<Int, Never>()
pub1
.combineLatest(pub2)
.map { $0 * $1 } // map() で処理
.sink { print("Result: \($0).") }
.store(in: &cancellables)
pub1.send(2)
pub2.send(3)
// Result: 6.
pub1.send(4)
// Result: 12.
pub1
.combineLatest(pub2) { $0 * $1 } // 変更
.sink { print("Result: \($0).") }
.store(in: &cancellables)
pub1.send(2)
pub2.send(3)
// Result: 6.
pub1.send(4)
// Result: 12.
このように combineLatest()
-> map()
で書いていた処理は combineLatest() {}
で書き直せます。
pub1
.combineLatest(pub2, pub3) { $0 * $1 * $2 } // 変更
.sink { print("Result: \($0).") }
.store(in: &cancellables)
pub1.send(2)
pub2.send(3)
pub3.send(4)
// Result: 24.
pub1.send(5)
// Result: 60.
pub1
.zip(pub2) { $0 * $1 }
.sink { print("Result: \($0).") }
.store(in: &cancellables)
pub1.send(2)
pub2.send(3)
// Result: 6.
pub1.send(4)
// zip() は揃わないと出力なし!!
pub1
.combineLatest(pub2)
.flatMap { pub1, pub2 -> AnyPublisher<String, Never> in
Just("\(pub1)\(pub2)").eraseToAnyPublisher()
}
.sink { print("Result: \($0).") }
.store(in: &cancellables)
pub1.send(2)
pub2.send(3)
// Result: 23.
pub1.send(4)
// Result: 43.
pub1
.combineLatest(pub2) { pub1, pub2 -> AnyPublisher<String, Never> in
Just("\(pub1)\(pub2)").eraseToAnyPublisher()
}
.flatMap { $0 }
.sink { print("Result: \($0).") }
.store(in: &cancellables)
pub1.send(2)
pub2.send(3)
// Result: 23.
pub1.send(4)
// Result: 43.
結局、flatMap()
は残るので微妙ですね。
以上になります。