ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SwiftUI] Identity, lifetime, dependencies
    SwiftUI 2024. 3. 29. 15:52

    WWDC21 Demystify SwiftUI 를 보고 개인적인 생각을 정리한 내용입니다.

     


     

    SwiftUI는 선언적 UI,
    즉, 뷰가 어떻게 바껴야 하는지 미리 정의해두는 것이다.
    따라서 SwiftUI가 우리의 앱을 어떻게 바라보는지에 대한 이해가 필요하다.

    SwiftUI가 앱을 다룰지에 대한 핵심은 3가지.
    Identity, lifetime, dependencies를 이해해야 한다.

    # Identity

    제일 먼저 뷰를 어떻게 구분할 것인가에 대한 개념이 필요하고,
    이를 Identity라고 부른다. Identity가 동일하면 같은 뷰로 바라보는 것이다.

    ## Identity Type

    모든 뷰는 Identity를 갖는다.
    종류로는 명시적, 구조적(explict, structural) Identity가 있다.

    explict Identity란, 명시적으로 Id 값을 지정해 주는 걸 의미한다.
    뷰의 id값을 지정해주거나 ForEach 에서 id를 정해주는 걸 생각해볼 수 있다.

    structural Identity는 SwiftUI가 자동으로 부여하는 Identity를 의미한다.
    if else / switch 같은 분기문을 사용할 경우 분기마다 SwiftUI는 새로운 view를 만들고 새로운 Identity를 부여한다.

    # lifetime

    뷰의 생명주기를 의미한다.
    위에서 분기를 사용할 경우 새로운 view를 만들고 새로운 Identity를 부여한다고 했다.
    즉, 이전 뷰는 메모리에서 사라지고 생명주기는 종료된다.

    생명 주기를 유지하려면 @State, @StateObject 등을 사용하면 된다.
    @State나 @StateObject 등을 통해 값을 바꾸면, view value는 변해도 view lifetime은 유지된다.

    https://developer.apple.com/wwdc21/10022

    영상의 예를 통해 정리해보자.

    If else 를 통해 두 상태를 분기했다면, 두 발바닥을 다른 뷰로 바라본 것이다.
    녹색에서 빨간색으로 갈 때 새로운 뷰가 새로 생성된다. 녹색 발바닥이 사라지고 빨간색 발바닥이 나타난다.

    modifier 등을 사용해 상태를 분기했다면, 두 발바닥을 하나의 뷰로 바라본 것이다.
    녹색에서 빨간색으로 갈 때 현재 뷰는 유지되고, 이동하는 형태가 된다.

    ## view Identity == view lifetime

    view identity == view lifetime 으로 볼 수 있고
    state lifetime == view lifetime 이다.

    하지만 view value는 view lifetime과 같지 않다.

     

    # Dependencies

    dependencies는 뷰에 주입해주는 값들이다.
    dependencies가 변하면 view는 새로운 body를 만든다.

    SwiftUI는 계층 구조를 띄는데, 어떤 액션에 의해 상태가 변하면 
    view는 invalidate되고 업데이트 된다.

    SwiftUI는 최적화를 위해 특정 값과 연관이 되어 있는 뷰들만 업데이트 시킨다. 따라서 그래프의 형태를 띄게 되고 
    Dependency Graph라고 부른다.

    https://developer.apple.com/wwdc21/10022
    https://developer.apple.com/wwdc21/10022

     

    # 참고

    https://developer.apple.com/wwdc21/10022

    'SwiftUI' 카테고리의 다른 글

    [SwiftUI] HStack 하위 요소 > 최대 높이로 동일하게 맞추기  (0) 2023.05.22
    task(priority:_:)  (0) 2023.01.28
    StateObject  (0) 2023.01.28
    ObservedObject  (0) 2023.01.28
    ObservableObject  (0) 2023.01.28

    댓글

Designed by Tistory.