Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 1018 - Combineフレームワークのオペレーターを復習

皆さん、新しいXcode12のβ版が利用できるんで、試している人も多いのではないでしょうか?WWDC2020の動画配信も見て勉強していることでしょう。

私は、全く新しい内容に取り組んでいないんです。チンタラとSwiftUIを勉強してます。

更新を長い間しないと、もうプログラミングの勉強をしていないと思われるかもしれないんでちょっと更新。Combineフレームワークで必要なオペレーターのリストを備忘録として残しておきます。全てのオペレーターの挙動をちゃんと理解していないといけないのですが、まだまだ完全に理解できてませんね。

  1. Map(upstream: Publisher, transform: Closure)
  2. Filter(upstream: Publisher, isIncluded: Closure)
  3. Debounce(upstream: Publisher, dueTime: SchedulerTimeIntervalConvertible, scheduler: Queue)
  4. RemoveDuplicates(upstream: Publisher, predicate: Closure)
  5. ReceiveOn(upstream: Publisher, scheduler: Closure)
  6. TryMap(upstream: Publisher, transform: Closure)
  7. FlatMap(upstream: Publisher, maxPublisher: Demand, transform: Closure)
  8. Catch(upstream: Publisher, handler: Closure)
  9. CombineLatest(Publisher, Publisher)
  10. Merge(Publisher, Publisher)
  11. Zip(Publisher, Publisher)
  12. Decode(upstream: Publisher, decoder: Coder)
  13. Autoconnect(upstream: Upstream)

やっとパブリシャー&サブスクライバーの理解が深くなりました。画面のカウンターが自動的にカウントアップしていくコードが次のものです

import SwiftUI

class ViewData: ObservableObject {
   @Published var counter: Int = 0

    let timerPublisher = Timer.publish(every: 1, on: RunLoop.main, in: .default)
      .autoconnect()
}

struct ContentView: View {
   @ObservedObject var viewData = ViewData()

   var body: some View {
      Text("カウント: \(viewData.counter)")
         .onReceive(viewData.timerPublisher, perform: { value in
            self.viewData.counter += 1
         })
   }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}