<h1><center> SwiftUI View Rendering (1) </center></h1>
###### title: `SwiftUI View Rendering`
###### tags: `๐ป TIL`, `SwiftUI`, `View Rendering`
###### date: `2023-11-14T10:39:33.284Z`
> [color=#724cd1][name=๋ฐ๋ฆญ]
> [SwiftUI View Lifecycle - Vadim Bulavin](https://www.vadimbulavin.com/swiftui-view-lifecycle/)
> [Thinking in SwiftUI](https://www.objc.io/books/thinking-in-swiftui/)
> [The SwiftUI render loop - Rens Breur](https://rensbr.eu/blog/swiftui-render-loop/)
> [Exploring SwiftUI 3: View Hierarchies and State Updates - Benedict Quinn](https://blog.scottlogic.com/2020/01/28/Exploring-SwiftUI-3-View-Updates.html)
> [Understanding View Rendering Cycle in SwiftUI - azamsharp(YouTube)](https://www.youtube.com/watch?v=imiKAwYTX6s)
> [SwiftUIโs relationship to UIKit and AppKit - WWDC by Sundell](https://wwdcbysundell.com/2019/swiftui-relationship-to-uikit-appkit/)
> [Advanced Graphics and Animations for iOS Apps - WWDC NOTES by Federico Zanetello](https://www.wwdcnotes.com/notes/wwdc14/419/)
> [๋ธ๋ก๊ทธ - Coden](https://velog.io/@ictechgy/SwiftUI%EC%9D%98-View-%EB%A0%8C%EB%8D%94%EB%A7%81%EC%9D%80-%EC%96%B8%EC%A0%9C-%EC%9D%B4%EB%A3%A8%EC%96%B4%EC%A7%80%EB%8A%94%EA%B0%80)
## ๊ฐ์
> SwiftUI์ View์ Rendering ๊ณผ์ ์ด ์ด๋ป๊ฒ ๋๋๊ฐ? <br>
> ์ด ๊ณผ์ ์ด ๊ถ๊ธํ ์ด์ ๋ View์ UIComponent์ ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค, onAppear๊ฐ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ด๋ค. onAppear ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ฌด์์ด ์๋๋ฉด, ๋ด๊ฐ ์๊ธฐ์น ๋ชปํ ์ํฉ์์๋ ํธ์ถ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค. UIKit์ผ๋ก ์๊ฐํด๋ณด๋ฉด layout์ subviews๋ฅผ ๋ค์ ๊ทธ๋ ค๋ผ๋ ๋ฉ์๋(setneedslayout, layoutifneeded)๋ฅผ ์คํ ์ํค์ง ์์ผ๋ฉด viewWillAppear๊ฐ ๋ค์ ํธ์ถ๋๋ ์ํฉ์ ์๊ฐํ๊ธฐ ์ด๋ ต๋ค. <br>
- ๊ทธ๋์ ์ผ๋จ ์ด๋ป๊ฒ View Rendering์ ํ๊ณ View์ Lifetime์ ๋ํด ๊ณต๋ถํ๊ณ ์ ํ๋ค.
- ๋๋ฌด ๋ด์ฉ์ด ๋ฐฉ๋ํ๊ธฐ ๋๋ฌธ์ ์๋ฆฌ์ฆ๋ก ๋๋ ์ ํด๋น ๋ด์ฉ์ ์์ฑํ ๊ฒ์ด๋ค.
## UnderStanding SwiftUI Views
> UIKit๋ ๋ง์ฐฌ๊ฐ์ง์ง๋ง, SwiftUI ๋ํ ์ฑ์ ๋ง๋ค ๋ ๋ผ์ดํ ์ฌ์ดํด์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ด๋ค.
View์ ํ์๋๋ Content๋ฅผ ์ค๋ช
ํ๊ธฐ ์ํด ์กฐํ์ ๊ทธ๋ํ๋ฅผ ๋ง๋ ๋ค.
SwiftUI๋ UI๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด View ๊ทธ๋ํ๋ฅผ ์ง์ ๋ณ๊ฒฝํ์ง ์๋๋ค. ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋, ์๋ก์ด ์ํ ๊ฐ์ ํตํด ์๋ก์ด View ๊ทธ๋ํ๊ฐ ๊ณ์ฐ๋๋ค. ๊ทธ ๋ค์ SwiftUI๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ํด Rendering ์์
์ ์งํํ๋ค.
> SwiftUI์ identity์ lifetime์ SwiftUI์ ์ ์๋ struct์ lifetime๊ณผ๋ ๋ณ๊ฐ๋ก ๋ถ๋ฆฌ๋๋ค.
SwiftUI์ ViewGraph๋ ๋ทฐ์ Rendering, non-Rendering ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
**Non-Rendering ๊ณ์ธต๊ตฌ์กฐ**
- Screen์ ํ์๋์ด์ผ ํ๋ ํญ๋ชฉ๋ค์ ๋ํ ์ ์์ด๋ค.
- SwiftUI๋ struct์ body๋ฅผ ์ฌ์ฉํ์ฌ View๊ฐ ์์ฑ๋๋ค. SwiftUI๋ UI์ ๋ํ ๋ชจ๋ ์
๋ฐ์ดํธ๋ฅผ Non-Rendering ๊ณ์ธต ๊ตฌ์กฐ์ ์ด์ ๋ด์ฉ๊ณผ ์๋กญ๊ฒ ๋ง๋ค์ด์ง Snapshot์ ํ์ํ์ฌ ๋ณ๊ฒฝ๋ ๋ด์ฉ๋ค์ ๊ณ์ฐํ๋ค.
- ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ๋น๊ตํ๊ธฐ ์ํด private AttributeGraph Framework๋ฅผ ์ฌ์ฉํ๋ค.
**Rendering ๊ณ์ธต๊ตฌ์กฐ**
- SwiftUI๋ Rendering ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํตํด ์ค์ ๊ทธ๋ ค์ง ๋ถ๋ถ์ ์์ฑํ๊ฒ ๋๋ค. ์ด ๋, ๊ณ์ธต๊ตฌ์กฐ์ ๋ทฐ์๋ ๊ฐ๊ฐ ๊ณ ์ ํ ID๊ฐ ์์ผ๋ฉฐ, ๊ฐ ๋ทฐ๋ค์ lifetime์ Screen์ ํ์๋๋ ๋์์ ์๊ฐ์ ๋งํ๋ค.
> View Body์ ํ์
์ ์ ์ฒด ๋ทฐ์ ํ์ ๊ทธ๋ํ๋ฅผ Encodingํ๋ค.
์ฑ์ root View ๋ด body ํ์
์ ๊ฒ์ฌํ๋ฉด ๋ทฐ ์ ์ฒด ๊ณ์ธต๊ตฌ์กฐ๊ฐ ํฌํจ๋์ด ์๋ ๊ฒ์ ์ ์ ์๋ค.
```swift
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, world")
.background(Color.yellow)
.font(.title)
.dump()
}
}
extension View {
func dump() -> Self {
print(Mirror(reflecting: self))
return self
}
}
```
```
// Mirror for ModifiedContent<ModifiedContent<Text, _BackgroundModifier<Color>>, _EnvironmentKeyWritingModifier<Optional<Font>>>
```
printํ๋ฉด ์์ ๊ฐ์ ๋ด์ฉ์ ํ์ธํ ์ ์๋ค.
์ด print์๋ View์ ๋ํ๋ ์ ์๋ ๋ชจ๋ ๋ณํ๋ค์ด ํฌํจ๋๋ค.
์ด ๋ด์ฉ์ ์๋์์ ๋ค์ ๊ฒ์ฆํ๋ค.
```swift
struct ContentView_: View {
var body: some View {
Group {
if true {
Color.yellow
} else {
Text("Impossible")
}
}
.dump()
}
}
```
```
// Mirror for Group<_ConditionalContent<Color, Text>>
```
- Text๋ ๋ณด์ฌ์ง ์ ์์ง๋ง, `_ConditionalContent<Color, Text>`์๋ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
**NOTE**
> `Thinking in SwiftUI`์ ๋ฐ๋ฅด๋ฉด ํ์ฌ ๋ณด์ด๋ ๊ณ์ธต ๊ตฌ์กฐ๋ณด๋ค ๋ทฐ ์ ์ฒด์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ธ์ฝ๋ฉํ๋ฉด ๋ ํจ์จ์ ์ธ ๋น๊ต๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ด์ ์ด ์๋ค.
์ ์ฒด ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ body์ ํ์
์ผ๋ก ์ธ์ฝ๋ฉํ๋ฉด ๋ทฐ ๊ทธ๋ํ์ ํฐ ๋ถ๋ถ์ด ๋ฏธ๋ฆฌ ๊ตฌ์ฑ๋๋ค. ๋ ๋์๊ฐ์, SwiftUI์ Data Essentials์ ๋ฐ๋ฅด๋ฉด ๋ทฐ๋ ์์ฃผ ๋ณต์ฌ๋๋๋ฐ ์ด ๋ ๋ ๊ฐ์ง ์ฌํญ์ ์ผ๋์ ๋๊ณ ๊ฐ๋ฐํด์ผ ํ๋ค.
- initialization์ ๋น์ฉ์ด ์ ๊ฒ ๋ค๊ฒ ๋ง๋ค์ด์ผ ํ๋ค.
- body ํจ์๋ side effect๊ฐ ์๊ฒ pureํ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค. ์ด๋ค ์ถ๊ฐ์ ์ธ ์ถ์ ์ด ํ์ํ ์์
์์ด body ๋ด์์ ๋จ์ํ๊ฒ ๋ทฐ๋ฅผ ๋ง๋ค๊ณ ๋ฐํํด์ผ ํ๋ค.