SwiftUI_stateObject_observedObject

Woozoo·2023년 1월 2일
0

깃헙스위프트기초

목록 보기
35/38

SwiftUI_stateObject_observedObject

  • SwiftUI에서는 Single source of truth에 의한 상태 관리가 중요함
  • SwiftUI에서는 @State를 이용해서 Single source of truth 상태를 나타낼 수 있음
  • @Binding을 통해서 Single source of truth 상태 정보에 접근 가능
  • SwiftUI에서는 상태가 변하면, 뷰는 상태를 반영하여 자동으로 그려짐

SwiftUI에서 중요하게 생각하는 것

  • 바로 Single Source of truth 에 의한 상태 관리
    • 요즘 애플 wwdc 영상을 보면 single source truth가 많이 나온다.
    • 그만큼, 그전에 데이터가 여기저기 주고받아지고, 그렇게 주고 받은 데이터를 여기저기서 수정하고,
      • 결국에는 어떤 게 진짜인지 헷갈리고, 복사된 데이터가 상태가 다 다르다보니
        버그에 취약해지고 -> 그만큼 개발자가 더 신경을 많이 썼어야했음
        -> 애플 생각은, 개발자들이 신경 덜쓸 수 있는 시스템을 만들어줘야겠다!

State, Binding은 Value 타입을 위한 것임

  • struct,enum
  • String, Int, Bool

그럼 class 같은 Reference 타입은?

  • 바로 @StateObject, `@ObservedObject를 이용하면 됨
    • SSO(Single source of truth)
      • Value 타입: @State
      • Reference 타입: @StateObject
    • Reference of SSO
      • Value 타입: @Binding
      • Reference 타입: @ObservedObject

어떻게 @StateObject, @ObservedObject 클래스를 만들까?

  • Observable protocol 사용해서 class 생성
  • 변경에 대한 옵저빙이 필요한 프로퍼티는 앞에 @Published 붙이기
    • @Published가 붙은 프로퍼티의 값이 변경될 때마다 Observable class를 통해 알아차림
class Contact: ObservableObject {
    @Published var name: String
    @Published var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    func haveBirthday() -> Int {
        age += 1
        return age
    }
}

let john = Contact(name: "John Appleseed", age: 24)
cancellable = john.objectWillChange
    .sink { _ in
        print("\(john.age) will change")
}
print(john.haveBirthday())
profile
우주형

0개의 댓글