【Swift/Combine】removeDuplicatesの使い方!重複値を制御

この記事からわかること
- SwiftでCombineのremoveDuplicatesの使い方
- 重複した値を制御する方法
index
[open]
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.0
- watchOS:10.0
- Swift:5.9
- macOS:Sonoma 14.1
removeDuplicatesとは?
func removeDuplicates() -> Publishers.RemoveDuplicates<Self>
removeDuplicates
メソッドは1つ前の値と流れてきた最新の値を比較して重複していれば公開しないメソッドです。これを利用することで値の変化が起きていない時にサブスクライバーに対して不要に値を流さないようにすることができます。
使い方
removeDuplicates
はパブリッシャーから呼び出して使用します。上流から値が流れてきますが、その際に1つ前の値を内部的に保持しており、比較して同じなら流れを堰き止めます。
let subject = PassthroughSubject<Int, Never>()
let cancellable = subject
.removeDuplicates() // 重複値を堰き止める
.sink { value in
print("\(value)")
}
// 値を送信
subject.send(1)
subject.send(1)
subject.send(2)
subject.send(2)
subject.send(3)
subject.send(3)
subject.send(1)
// 結果:1, 2, 3, 1
条件を自分で指定する
removeDuplicates(by:)
を使用することで値の一致条件を自分で定義することができます。
let subject = PassthroughSubject<Person, Never>()
let cancellable = subject
.removeDuplicates(by: { (prev, next) in
return prev.id == next.id
})
.sink { person in
print("Received person: \(person)")
}
// 値を送信
subject.send(Person(id: 1, name: "まひろ"))
subject.send(Person(id: 1, name: "まひろ"))
subject.send(Person(id: 2, name: "かわもと"))
subject.send(Person(id: 2, name: "かわもと"))
subject.send(Person(id: 3, name: "たける"))
subject.send(Person(id: 3, name: "たける"))
subject.send(Person(id: 1, name: "まひろ"))
// 結果:まひろ、かわもと、たける、まひろ
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。