[SwiftUI 공부] SwiftUI @State, @Binding, @StateObject, @EnvironmentObject, ObservableObject 간단하게 알아보기

  [SwiftUI 공부] SwiftUI @State, @Binding, @StateObject, @EnvironmentObject, ObservableObject 간단하게 알아보기


안녕하세요. 물먹고하자 입니다 :)

SwiftUI를 현 프로젝트에 도입하면서 급급하게 만들다보니

제가 기초를 잘 모르겠더군요 ㅋㅋ

iOS 짬밥(?)으로 돌아가는 기본원리는 대략적으로 알지만,

내용정리를 해보고 싶어서 틈틈히 SwiftUI 내용 공유드릴까 합니다.




  샘플코드 : @State, @Binding

@State (iOS 13.0+, iPadOS 13.0+)

참조 : https://developer.apple.com/documentation/swiftui/state

Struct구조체의 경우 값의 변경이 불가능한데(mutating func을 통해는 가능) @State 값을 통해 변수를 직접변경하고, View 내부에서 사용되는 부분을 자동갱신 목적으로 사용됨.

처음 나왔을때 UI에 실시간 반영되는 형식이 매우 신기했던 기억이 있습니다.

지금은 @Binding 을 사용할때 빼고는 솔직히 잘 안쓰고 있습니다. (@StateObject를 주로사용함.)


@Binding (iOS 13.0+, iPadOS 13.0+)

참조 : https://developer.apple.com/documentation/swiftui/binding

@State 값을 다른 특정 View에 대입시키는 방법으로 주소를 공유해서 동일하게 값을 변경할 수 있습니다.

공통적인 View를 분리해서 만들고 값을 공유해서 호출된 View에도 값을 전달할때 사용합니다.




  샘플코드 : @ StateObject, @EnvironmentObject, ObservableObject

@StateObject (iOS 14.0+, iPadOS 14.0+)

참조 : https://developer.apple.com/documentation/swiftui/stateobject

ViewModel을 선언할때 사용되며, 

@ObservedObject(iOS13이상) 과 동작방식은 동일하지만, 차이점은 다른상태값이 변경되었을때 초기화된다는점에 차이가 있어서, 솔직히 @StateObject부터 혼돈없이 사용하고 있습니다.

간략하게는 SwiftUI를 iOS14부터 사용하게된 계기도 @StateObject 나오고 나서 실제업무에 SwiftUI 도입을 했습니다.


@EnvironmentObject (iOS 13.0+, iPadOS 13.0+)

참조 : https://developer.apple.com/documentation/swiftui/environmentobject

@ObservedObject, @StateObject을 사용중인 객체를 ChildView로 공유할때 사용합니다. 

처음에는 View를 나누고 ViewModel을 공유하기 편해서 사용하긴 했지만, UIKit + SwiftUI 구조상에는 많이는 사용하지 않고, SwiftUI 전용으로 master/detail 구조로 만든 화면에서는 데이터 공유상 사용하고 있습니다. 


ObservableObject (iOS 13.0+, iPadOS 13.0+)

참조 : https://developer.apple.com/documentation/combine/observableobject

ViewModel에 사용되는 Object이며, @Published를 통해 SwiftUI View를 자동갱신할 수 있습니다.

저는 @StateObject + ObservableObject 를 통해 전반적인 SwiftUI MVVM 데이터 흐름을 맞춰서 주로 사용하고 있습니다.

#. 사용하다보니 Array[객체] 내부에 값이 변경되었을때는 자동갱신이 되지 않아 Array 작업후  "objectWillChange.send()" 로 강제 갱신요청을 하였습니다.


  마무리

SwiftUI가 처음나오고 (iOS 13.0) 샘플링만 하다가 실제 프로젝트 도입은 iOS 14.0 이상 부터 하였는데, 정리하다보니 또 차이가 있었더군요. 점점 샘플자료 만들다보니 하나의 언어테이션에 엄청나게 많은 정보들이 함축 되어있어서 나열하다보면 안끝날 것 같아서 간략한 샘플코드와 함께 정보만 공유드립니다.


이제는 UIKit 정보보다 SwiftUI 정보가 확실히 많아 지고 있어서 예전에 

Objc -> Swift 전환속도보다 UIKit -> SwiftUI 빠른것 같습니다. (저도 노력해야겠내요)


오늘은 이만

즐거운 코딩되세요 :)


끝.



댓글

댓글 쓰기