TIL - 2024.04.26 금요일

· 성취/개선/학습한 내용 🏆

 SwiftUI의 Property Wrapper에 대하 많이 학습한 시간이었다. SwiftUI에서 뷰를 많이 나누면 MVVM이 필요 없을 수도 있지만 만일 MVVM 패턴을 사용한다면 뷰모델에 @State를 사용하여 변수를 선언하는 것은 어울리지 않는다. 그 이유는 @State라는 것이 오로지 뷰를 위해 존재하는 것이기 때문에 의미가 없다. 그래서 나온 프로퍼티 레퍼가 바로 @Published이다. 이를 위해선 뷰모델 class에 ObservableObject를 채택해줘야 한다. 그리고 @StateObject var viewModel = ViewModel()로 뷰를 구성하는 구조체 내에 선언을 해줘야 뷰모델에 선언한 변수를 가져다 사용할 수 있다. 여기서 @StateObject는 값이 바뀌면 렌더링을 해주는 프로퍼티 래퍼이다. 정리해보자면 ObservableObject는 '달라지는 게 없나 확인할게!'이고 @Publisehd는 '값이 바뀌는 애를 관찰해 줄게'이며 마지막으로 @StateObject는 '바뀐 걸 랜더링 해 줄게!'가 되겠다.

 이때 예전의 나를 포함해 @StateObject와 @ObservedObject를 헷갈리는 사람이 많을텐데, 둘 다 @Published로 선언한 값이 변경될 때 변화를 감지하고 랜더링을 하는 것이다. 하지만 @ObservedObject는 뷰가 렌더링 될 때, ViewModel이 초기화되면서 인스턴스가 새롭게 생성된다. 따라서 변화시킨 값이 뷰가 렌더링 될 때 다시 초기화가 될 것이다. 반면 @StateObject는 하나의 객체로 만들어서 별개의 객체로 관리된다. 그리하여 View와 별개로 메모리 공간에 저장을 하여 렌더링이 된다 해도 값이 변하지 않는다.

 이 외에도 UserDefaults의 바뀐 값들을 사용할 때 사용하는 @AppStorage, 앱이 종료되기 전까지 그 Scene에서 데이터를 임시적으로 저장하고 싶을 때 사용한다. @EnvironmentObject는 서버 응답값, 데이터 등이 들어가고 이와 비슷하게 생긴 @Environment는 가로모드, 세로모드와 같은 환경변수를 사용할 때 사용한다. 마지막으로 UIViewRepresentable와 UIHostingController는 각각 UIKit을 SwiftUI로 래핑할 때, 그리고 반대의 경우에 사용을 한다.

  • SwiftUI
    • ObservableObject
    • @Published
    • @StateObject vs @ObservedObject
    • @Observable(iOS17.0+)
    • @AppStorage
    • @SceneStorage
    • @EnvironmentObject
    • @Environment
    • UIViewRepresentable
    • UIHostingController

 

· 궁금한 내용과 부족한 내용 ⁉️🤔

  • SwiftUI를 공부하다보면 Property Wrapper가 굉장히 많다는 것을 알 수 있다. 그리고 비슷한 이름의 Property Wrapper가 많기에 잘 구분해서 사용해야 한다. 정확하게 구별해서 각자의 역할을 알아둬야 한다.

· 느낀 점 🌟

 UIKit을 처음 공부할 때도 그랬지만 SwiftUI는 정말 쉽게 UI를 구현할 수 있게 해 준다. 여러 가지 면에서 편리한 부분도 많기에 최소버전만 올라온다면 많은 부분들이 SwiftUI로 구현될 것 같다. 그리고 예전에 SwiftUI로 여러 시도를 통해 많은 실패를 했었는데 그 이유와 작동 원리를 파악할 수 있어서 재밌었다.

 

 

'# TIL (Today I Learned)' 카테고리의 다른 글

TIL - 2024.04.30 화요일  (0) 2024.04.30
TIL - 2024.04.29 월요일  (0) 2024.04.29
TIL - 2024.04.25 목요일  (0) 2024.04.25
TIL - 2024.04.24 수요일  (0) 2024.04.24
TIL - 2024.04.23 화요일  (0) 2024.04.23