0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Swift】Combine-オペレーター

Last updated at Posted at 2024-07-24

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

他にも、combineLatestmergeなど、複数のパブリッシャーを組み合わせるためのオペレータも存在します。

このようにして、パブリッシャーからのデータを特定のオブジェクトに簡単に反映させることができます。以上のように、Combineのオペレータを活用することで、複雑なデータ変換や処理をシンプルに記述することができます。これにより、コードの可読性や保守性が向上し、より効率的な開発が可能になります。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?