Combine-ObservableObject

GomHyeok·2025년 1월 20일

SW마에스트로

목록 보기
2/2

📚ObservableObject

Class Protocol로 ObservableObject를 채택하면 해당 클래스 인스턴스 관찰하다 값이 변경되면 뷰를 업데이트함(class형태만 가능)

  • 대표적 예시 : @Published, @ObservedObject
  • ObservableObject는 필수 구현 프로토콜이 아님
  • objectWillChange라는 프로퍼티 사용 가능 -> .send()를 이용하기 위해서
    • .send()는 변경된 사항이 있다고 알려주는 함수!
  • 뷰를 렌더링 하는 것을 최소화 하기 위해 사용한다.

Property Wrapper

  • SwiftUI를 사용하다 보면...
    @Published
    @Binding
    @ObservedObject
    @State
    등등 이런 코드를 자주 접하게 되는데 이런 것들이 Property Wrapper다.

  • 사용 예시

struct Person {
	private var _name : String = ""
    
    var name : String {
    	get {self._name.uppercased()}
        set {self._name = newValue }
    }
    
    init(name : String) {
    	self.name = name
    }
}

여기서 중요한 부분은 바로 uppercased()로직 -> 자동으로 get하는 경우 대문자로 변환
만약 해당 로직을 다른 부분에서도 사용해야 한다면???

해당 로직을 Property Wrapper로 만든다면 코드 재사용성이 높아진다.

  • 정의 방법
@propertyWrapper
struct Uppercase{
	private value : String = ""
    
    var wrappedValue : String {
    	get { self.value }
        set { self.value = newValue.uppercased() }
    }
    
    init(wrappedValue initValue : String) {
    	self.wrappedValue = initValue
    }
}

@propertyWrapper를 통해 타입이 특별함을 알려준다.

이후 행동을 정의하는 타입을 만들고 반복되는 로직을 넣어준다.

  • 주의사항
    • init()이 없을 경우 사용시 type이 Uppercase타입으로 만들어진다.
    • didSet사용시에는 init에서 uppercased를 호출해줘야 한다.

참고자료 : WWDC19

📙 @Published

  • 돌고 돌아 다시 돌아와서 Published는 결국 ObservableObject 속성 선언시 사용하는 PropertyWrapper
  • 해당 속성이 업데이트 될 때마다 뷰를 업데이트 하겠다는 뜻
  • 해당 변수가 변경되면 자동으로 objectWillChange.send()호출
  • 프로퍼티 값이 변경될 때 마다 구독자(subscriber)에게 알림을 보낸다.
    - sink를 통해 구독하고 sink 클로저를 실행할 수 있다.

추가
해당 개념을 이용해서 viewModel을 만들던 도중 Protocol을 사용하다 보니 생각보다 typealias를 많이 사용하게 되었습니다.

  • protocol에서 typealias는 결국 Generic type을 사용하기 위한 타입 명시
  • protocol을 채택하는 곳에서 어떤 타입인지 명시해주는 것이 일반적임(추론이 가능할 경우 생갹 가능)
  • protocol에 기존 방식으로 제네릭 함수는 선언 가능..!
profile
github : https://github.com/GomHyeok/

0개의 댓글