Geon

Demystify SwiftUI 본문

SwiftUI/지식 창고

Demystify SwiftUI

jgkim1008 2024. 11. 7. 23:30

SwiftUI는 선언형 UI

SwiftUI의 뒤에서 뭐가 이루어지는지를 알아야한다.

SwiftUI가 코드를 볼때 무엇을 보는가 ->

Identity

 - 앱의 여러 업데이트에서 요소를 동일하거나 별개로 인식하는 방법

 - Identity란 동일한지 판별하는 요소

 

Explict Identity(명시적인 신원)

 - 같은 이름이나 식별자를 할당하는것

- 누군가 계속 추적해야함

- ForEach 에서 \.ID. 값을 쓰면 어떤것이 바뀌어야하는지 명확히 SwiftUI 가 알수 있다.

SwiftUI는 포인터가 없다

 

Strucural identity(구조적 정체성)

- SwiftUI는 뷰 계층 구조를 사용하여 뷰에 대한 암시적 ID를 생성한다

분기처리시 다른 뷰라고 인식한다.

as - ls

if keyword == "abc" {
 SomeView(backGroundColor: "black")
} else {
 SomeView(backGroundColor: "red")
}

to - be

SomeView(backgroundColor: keyword == "abc" ? "black" : "red")

 

- 아이덴티티를 유지하려고 하는것이 중요 (뷰의 수명과 상태를 보존하는데 도움)

 

AnyView

- 사람이 보기에 힘들다

- 컴파일러에서 정적 유형 정보를 숨겨서, 유용한 진단 오류 및 경고가 코드에 표시되지 않는다

- 필요하지 않을때 사용하면 성능이 저하된다.

 

- 일반적으로는 사용하지 말자

 

 

LifeTime

 - SwiftUI가 시간이 지남에 따라 뷰와 데이터의 존재를 추적하는 방법

- SwiftUI는 비교를 수행하고 뷰가 변경되었는지 알기 위해 값의 복사본을 유지 후 지운다.

- View의 Value가 변경이 되어도 SwiftUI의 관점에선 동일한 View이다.

- id가 바뀌거나, viweDisappear가 되면 다른 View로 인식

- state,stateObject는 view의 lifeTime과 동일시 되어 

- SwiftUI는 컬렉션 요소(ForEach)에서 생성된 모든 뷰에 ID를 할당을 해야하고, 이 속성은 HashAble 이여야 한다.

- 연결된 View의 수명 범위를 지정하기 위해 ID가 필요하다.

(결론)

- ID를 통해 LifeTime의 연속성을 컨트롤 한다.

- 뷰의 수명은 ID의 지속기간이므로 Identity의 안정성이 중요하다.

 

 

Dependencies

이를 통해 SwiftUI가 변경해야 할 사항,방법, 시기를 결정하여 화면에 표시되는 동적 사용사 인터페이스(Dynamic user InterFace)를 만드는 방법을 알려준다.

 - SwiftUI가 인터페이스를 업데이트 해야 하는 시기와 이유를 이해하는 방법

- @Binding 값이나 ,var, @State, @ObservedObject 등 Dynamic Object들은 다 Depencies다

- Dependency Graph

- 이를 통해 body가 갱신되는데, 종속성에 연결된 View가 변경되기에, Tree 구조가 아닌 graph 구조로 효율적인 업데이트 진행

 - 업데이트 된 View들은 없애고 새로 만듬

- Identity가 유니크 하고, 안정적이여야아 퍼포먼스 및 애니메이션이 향상된다.

 

 

Modifier 쓸떄 Branches를 쓰지 말아야 했다.

Strucural identity 때문에 2가지의 ID가 생겨난다.

 

 

'SwiftUI > 지식 창고' 카테고리의 다른 글

Explore UI animation hitches and the render loop  (0) 2024.11.09
Image DownSampling  (1) 2024.11.08
Crash on startup(when iOS18 update)  (0) 2024.10.28
mitmproxy로 iOS 네트워크 감청해보기  (1) 2024.09.05
긴급 심사 올리기  (0) 2024.08.21