Combineについて調べたこと備忘録としてまとめてみました。誤りがございましたらご指摘いただければ幸いです。m(__)m
オペレーター
オペレータ(Operator)は、データストリームを変換、フィルタリング、結合、または他の操作を行うために使用される関数やメソッドのことを指します。特に、リアクティブプログラミングの文脈では、オペレータはデータストリーム(パブリッシャー)に対してさまざまな操作を適用し、その結果を新しいデータストリームとして出力します。
以下に様々なオペレータを記述します。これらのオペレータは組み合わせて使用されることが多いです。例えば、map
を使ってデータを変換し、その結果をassign
またはsink
で受け取ることができます。
sink
sink
は、パブリッシャーから発行される値を受け取って処理するための方法です。
let cancellable = Just(100).sink(receiveValue: { value in
print("受け取りました:\\(value)")
})
このようにして、パブリッシャーからのデータを簡単に受け取ることができます。上のコードでは、Just
パブリッシャーが発行する値をprint
関数を使って出力しています。
また、assign
を使うことで、オブジェクトのプロパティに簡単にデータを代入することができます。以下で示します。
assign
assign
は、パブリッシャーから発行される値を特定のオブジェクトのプロパティに代入するために使用されます。以下のコードでは、PlayerScore
クラスのインスタンスのscore
プロパティに値を代入しています。
import Combine
class PlayerScore {
var score: Int
init(score: Int) {
self.score = score
}
}
let playerScore = PlayerScore(score: 0)
print("初期のスコア:\(playerScore.score)")
let cancellable = Just(1).assign(to: \.score, on: playerScore)
print("代入後のスコア:\(playerScore.score)")
//出力:
//初期のスコア:0
//代入後のスコア:1
上記の例はパブリッシャーが与える値の型と、サブスクライバーが期待する値の型が一致していたので、正常に動作しました。しかし、もしパブリッシャーが与える型がInt
でサブスクライバーが期待する値の型がString
だった場合、エラーになってしまいます。このような時に、双方で値の型を一致させてくれるのがmap
というオペレータになります。
map
map
オペレータは入力データを別の形式に変換する際に使用されます。例えば、整数を文字列に変換する場合などが挙げられます。
import Combine
class PlayerScore {
var score: String
init(score: String) {
self.score = score
}
}
let playerScore = PlayerScore(score: "0")
print("初期のスコア:\(playerScore.score)")
let cancellable = Just(1)
.map { value in
return String(value)
}
.assign(to: \.score, on: playerScore)
print("代入後のスコア:\(playerScore.score)")
//出力
//初期のスコア:0
//代入後のスコア:1
filter
また、filter
オペレータは、特定の条件に一致するデータだけを通過させるために使用されます。条件を満たす値だけが通過し、次の処理に渡されます。条件を満たさない値は破棄されます。
import Combine
class PlayerScore {
var score: String
init(score: String) {
self.score = score
}
}
let playerScore = PlayerScore(score: "0")
print("初期のスコア:\(playerScore.score)")
let cancellable = Just(50)
//条件 value >= 1 を満たす場合にのみ、次のオペレータ(ここではmapオペレータ)に値が渡されます。
.filter { value in
value >= 1
}
.map { value in
return String(value)
}
.assign(to: \.score, on: playerScore)
print("代入後のスコア:\(playerScore.score)")
//出力
//初期のスコア:0
//代入後のスコア:50
他にも、combineLatest
やmerge
など、複数のパブリッシャーを組み合わせるためのオペレータも存在します。
このようにして、パブリッシャーからのデータを特定のオブジェクトに簡単に反映させることができます。以上のように、Combineのオペレータを活用することで、複雑なデータ変換や処理をシンプルに記述することができます。これにより、コードの可読性や保守性が向上し、より効率的な開発が可能になります。
参考