[SwiftUI] StateObject

RudinP·2025년 8월 11일
0

Study

목록 보기
338/351

struct StateObject_Tutorials: View {
    @State private var color: Color = Color.gray
    
    var body: some View {
        VStack {
            NumberView()
                .frame(width: 200, height: 200)
                .background(color)
                .clipShape(Circle())
            
            Button {
                color = Color(white: Double.random(in: 0.5 ... 1.0), opacity: 1.0)
            } label: {
                Text("Change Color")
            }
            .padding()
        }
    }
}
  • 해당 코드에 의하면 숫자가 바뀌는 부분이 없으므로, 버튼을 누를때마다 컬러만 바뀌어야한다.
  • 하지만 숫자 또한 바뀌는데, 그 이유는 SwiftUI에서 상태가 바뀌면 body가 다시 호출되기 때문이다.

StateObject

  • 객체가 여러 번 초기화 되는 문제를 해결
struct NumberView: View {
    @ObservedObject var generator = RandomNumberGenerator()
    
    var body: some View {
        Text("\(generator.number)")
            .font(.largeTitle)        
    }
}
  • @ObservedObejct var generator@StateObject로 바꾼다.
struct NumberView: View {
    @StateObject var generator = RandomNumberGenerator()
    
    var body: some View {
        Text("\(generator.number)")
            .font(.largeTitle)        
    }
}

StateObject의 역할

  • ObservableObject를 만들어서 저장하기 위한 특성
  • 뷰가 사라지기 전까지 계속 같은 인스턴스를 유지해줌
  • 뷰를 업데이트해도 새로운 인스턴스 X
  • 값이 계속해서 갱신되어도 괜찮다면 굳이 사용하지 않아도 됨.

위치

  • 뷰 계층에서 모든 범위를 커버하는 공통 뷰를 찾는다.
  • 해당 위치에서 공유할 인스턴스 생성
@main
struct StatesApp: App {
    @StateObject var viewModel = ViewModel()
    
    var body: some Scene {
        WindowGroup {
            MainList()
        }
    }
}

이후

1. initializer로 전달

@main
struct StatesApp: App {
    @StateObject var viewModel = ViewModel()
    
    var body: some Scene {
        WindowGroup {
            MainList(viewModel: viewModel)
        }
    }
}

  • 계층이 많아지면 복잡해진다는 단점

2. environmentObject로 전달

  • 계층이 많아질 시 추천
@main
struct StatesApp: App {
    @StateObject var viewModel = ViewModel()
    
    var body: some Scene {
        WindowGroup {
            MainList()
                .environmentObject(viewModel)
        }
    }
}

결론 (패턴)

  1. ObservableObject로 공유할 데이터 구현
  2. @StateObject 로 인스턴스 구현
  3. @EnvironmentObject로 공유
profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글