본문 바로가기
TIL (Today I Learned)

[SwiftUI] SwiftUI의 View란?

by Bokoo14 2024. 1. 30.

https://developer.apple.com/documentation/swiftui/view

 

View | Apple Developer Documentation

A type that represents part of your app’s user interface and provides modifiers that you use to configure views.

developer.apple.com


1. SwiftUI View란?

앱 사용자 인터페이스의 일부를 나타내고 뷰를 구성하는 데 사용하는 수정자를 제공하는 유형

뷰는 프로토콜, UI의 한 부분을 나타냄. 다양한 모디파이어를 통해 해당 뷰의 속성을 변경하고 조정할 수 있음

뷰는 연관 타입으로 자기 자신을 바디로 칭함

뷰는 ViewBuiderMainActor 프로퍼티래퍼를 가진 바디라는 필수적인 요소를 구현해줘야 함

 

뷰는 ViewBuider MainActor 프로퍼티래퍼를 가진 Body라는 필수적인 요소를 구현해줘야 함

그렇다면 @ViewBuider, @MainActor란 무엇일까?


2.  @ViewBuilder란?

ViewBuilder: 구조체로 클로저에서 뷰를 구성하는 커스텀 매개변수 속성

<Content>

View타입으로 해당 뷰를 받아 결국 최종 뷰를 그려주도록 함

buildBlock

여러 Content를 가짐. 뷰 컴포넌트들의 배열을 깆고 하나의 뷰로 합쳐 만들어줌

[기존] buildBlock은 Content를 최대 10개씩 받는 파라미터를 통해 조합하여 TupleView로 구성하는 것에 있어 다양하게 존재

-> 한 View에 너무 많은 뷰 컴포넌트를 혼합하면 너무 많은 인자를 호출했다는 에러가 표시되는 경우가 존재

[현재] 파라미터로 넘겨주는 뷰의 갯수에 따라 Tuple View로 반복하여 합쳐 결국 하나의 View로 나타내는 buildBlock

@resultBuilder

swift5.4에서부터 도입된 개념으로 컴마(,)없이 배열을 구성하는 기능에 사용되는 Property Wrapper

받아온 타입들을 합쳐주기에 resultBuilder로 선언된 ViewBuilder를 사용함으로 뷰 컴포넌트들을 컴마(,)없이 나열하여 나타낼 수 있음


3. @MainActor란?

동시성 API중 하나로 메인 스레드에서 동작을 보장

DispatchQueue.main를 쓰지 않아도 메인 스레드에서 동작할 수 있도록 해줌

Swift5.5이상에서 동시성 문제를 해결하기 위해 나온 새로운 actor모델도입

공유 상태에 대한 안전한 접근을 제공

각각의 actor인스턴스는 자체 직렬 큐를 가지고 있음

해당 actor의 상태를 수정하는 작업이 동시에 수행되지 않도록 해줌

 

@globalActor: 특정 globalActor로 실행되어야 하는 코드를 표시. 전역적으로 사용할 수 있는 직렬화된 액세스 제공

MainActor: UIKit, SwiftUI와 같은 UI프레임워크에서 주로 사용. UI관련 작업이 메인 스레드에서 실행되도록 보장

 

뷰의 업데이트는 메인 스레드에서 이뤄져야하며, 이 동작을 보장해주도록 SwiftUI의 View에서 기능을 내포


4. SwiftUI에서 View는 왜 구조체일까?

View를 구조체로 생성하는 이유

1. 뷰 자체가 가벼워지기에 성능 이점

- SwiftUI는 상위에서 오는 어떠한 상속된 값도 없이 생성하려는 구조체만큼의 크기를 가짐

- 배경, 색상과 같은 속성을 가져야 한다면, 상속으로 모두 갖고 있는 것이 아니라 View modifier를 통해 속성 뷰에 새로운 뷰를 만들어냄

2. 클린한 상태를 유지할 수 있음

- UIKit은 클래스의 뷰를 생성하므로 어떤 곳에서 같이 참조한다면 내부값을 쉽게 바꿀 수 있는 형태(모든 뷰 상태를 체크하며 변화가 일어나는지 신경을 써야 함

- SwiftUI는 구조체로 해당 뷰를 정의하고 생성되는 곳에서만 사용될 것임. 그 부분만 신경을 쓰면 됨 (단위적으로 쉽게 확인 가능, 수정, 테스트 용이)

- 애플은 SwiftUI에서 값이 변경되는 시점도 기능적인 디자인 접근 방식으로 이동하는 것을 권장 (독립적인 뷰 단위로 판단할 수 있음)

3. 효율적인 메모리 관리

- class는 ARC를 통해 메모리를 관리. 참조 타입이므로 인스턴스 생성 시 메모리를 잡게 됨, 사용되지 않는데, 해제되지 않는 메모리 누수가 발생할 수 있음

- struct는 값 타입의 특성. 실제 사용될때 메모리가 할당(Copy on Write). 메모리에 효율적, 메모리 누수가 발생하지 않음

 

 

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

[Swift] Class vs Struct  (0) 2024.02.10
[Swift] 메모리 관리  (1) 2024.02.08
ObservableObject , @ObservedObject, @StateObject  (0) 2024.01.21
[iOS] NearbyInteraction란?  (2) 2024.01.13
[macOS] 샌드박스란?  (3) 2024.01.13