3
1

More than 1 year has passed since last update.

【Swift】TCAでの2種類のViewStoreの扱い方

Last updated at Posted at 2023-08-14

はじめに

TCAを勉強中で完全に理解しているわけではないので、間違っている箇所があればコメントで教えてください。

Reducerはこんな感じ

import ComposableArchitecture

struct Feature: Reducer {
    struct State: Equatable {
        var text = "Hello, World!"
    }
    
    enum Action: Equatable {
        
    }
    
    func reduce(into state: inout State, action: Action) -> Effect<Action> {
        
    }
}

実装1

import SwiftUI
import ComposableArchitecture

struct ContentView: View {
    let store: StoreOf<Feature>
    
    var body: some View {
        WithViewStore(store, observe: { $0 }) { viewStore in
            Text("Hello, World!")
        }
    }
}

実装2

import SwiftUI
import ComposableArchitecture

struct ContentView: View {
    @ObservedObject private var viewStore: ViewStoreOf<Feature>
    
    let store: StoreOf<Feature>
    
    init(store: StoreOf<Feature>) {
        self.store = store
        self.viewStore = ViewStore(store, observe: { $0 })
    }
    
    var body: some View {
        Text(viewStore.text)
    }
}

公式コメント

ViewStoreの説明

ViewStore は状態の変化を監視し、アクションを送信できるオブジェクトです。SwiftUI のビュー、UIView や UIViewController などのビューで最も一般的に使用されますが、状態を監視したり、アクションを送信したりする意味があれば、どこでも使用できます。

SwiftUI アプリケーションでは、ViewStoreWithViewStore ビューを使用して最も一般的にアクセスされます。
ビューを使ってアクセスします。ビューストアとビューを返すクロージャで初期化することができます

@ObservedObjectを使うこともできるよ

ビューストアは、ビュー、シーン、コマンド、および @ObservedObject プロパティラッパーをサポートする他のコンテキストによって直接観察することもできます

エラー出るなら@ObservedObjectを使ってみて

ヒント: WithViewStore を使用したビューでコンパイル時に問題が発生する場合は、代わりに @ObservedObject プロパティラッパーを使用してビューストアを直接観察してみてください。

おわり

ここファイルに書いてあります。

基本はWithViewStoreを使えってことでしょうか?
いまいちわからないです

3
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
3
1