-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create 240820_SwiftUI,_Property_Wrapper.md
- Loading branch information
Showing
1 changed file
with
210 additions
and
0 deletions.
There are no files selected for viewing
210 changes: 210 additions & 0 deletions
210
Sources/AriNote/TIL.docc/SwiftUI/240819_SwiftUI,_Property_Wrapper.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,210 @@ | ||
# 240819 SwiftUI Property Wrapper | ||
|
||
SwiftUIμ νλ‘νΌν° λνΌ μ’ λ₯ λν΄μ κ°λ¨ν μμ보μ. | ||
|
||
8μ 19μΌ (μ) | ||
|
||
# νμ΅λ΄μ© | ||
|
||
νμ¬ νλ‘μ νΈ λ΄ μΌλΆ νλ©΄μ SwiftUIμ Combineμ μ¬μ©νμ¬ λ¦¬ν©ν λ§μ μ§νν΄λ³΄μλλ°, μ¬μ©ν νλ‘νΌν° λνΌμ λν μ΄ν΄λκ° λΆμ‘±ν κ² κ°μμ μμ보μλ€. | ||
|
||
## Property Wrapper | ||
|
||
SwiftUIμμ νλ‘νΌν° λνΌλ μν κ΄λ¦¬λ₯Ό μ½κ² νκ³ λ·°μ λ°μ΄ν° κ°μ μνΈμμ©μ κ°λ¨νκ² ν μ μλλ‘ λμμ€λ€. | ||
|
||
### `@State` | ||
|
||
`@State`λ SwiftUIμμ λ‘컬 λ·° μνλ₯Ό κ΄λ¦¬νκΈ° μν΄ μ¬μ©λλ€. `@State`λ‘ μ μΈλ λ³μλ λ³κ²½λ λ λ§λ€ ν΄λΉ λ³μλ₯Ό μ¬μ©νλ λ·°κ° λ€μ λ λλ§λλ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* λ·° λ΄λΆμμλ§ μ¬μ©νλ κ°λ¨ν μνλ₯Ό κ΄λ¦¬ν λ μ¬μ©νλ€. μλ₯Ό λ€μ΄, λ²νΌμ νμ±ν μν, ν κΈ μν, ν μ€νΈ νλμ μ λ ₯ κ° λ±μ κ΄λ¦¬ν λ μ ν©νλ€. | ||
* λΆλͺ¨λ·°λ μΈλΆμμ μ κ·Όν νμκ° μμΌλ©° λ·°κ° λ€μ λ λλ§λ λλ§λ€ νμμ λ°λΌ μ λ°μ΄νΈ νκ² λλ€. | ||
|
||
`@State`λ λ·°κ° μλ©Έλλ©΄ μνλ ν¨κ» μ¬λΌμ§λ―λ‘ λ·°μ μλͺ μ£ΌκΈ°μ ν¨κ» μνκ° μ΄κΈ°νλλ€. λ°λΌμ μ₯κΈ°μ μΈ μν μ μ₯μ΄ νμν κ²½μ°μλ @AppStorage, @SceneStorageλ₯Ό κ³ λ €ν΄μΌ νλ€. | ||
|
||
### `@Binding` | ||
|
||
`@Binding`μ λΆλͺ¨λ·°μμ κ΄λ¦¬νλ μνλ₯Ό μμλ·°λ‘ μ λ¬νμ¬ μμλ·°μμ μνλ₯Ό μμ ν μ μκ² ν΄μ€λ€. `@Binding`μ μ¬μ©νλ©΄ μμλ·°κ° λΆλͺ¨λ·°μ μνλ₯Ό μ§μ μμ ν μ μμ΄ λ·° κ° μν λκΈ°νκ° κ°λ₯νλ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* λΆλͺ¨λ·°μμ μ μλ μνλ₯Ό μμλ·°μμ μ°Έμ‘°νκ³ μμ ν νμκ° μμ λ μ¬μ©νλ€. | ||
* μλ₯Ό λ€μ΄ λΆλͺ¨λ·°μμ κ΄λ¦¬νλ ν μ€νΈ νλμ κ°μ μμλ·°μμ νΈμ§ν μ μλλ‘ ν΄μΌν λ μ ν©νλ€. | ||
|
||
`@Binding`μ ν΅ν΄ μμλ·°κ° μνλ₯Ό μμ ν μ μμ§λ§, λΆλͺ¨λ·°μ μνκ° μμμΉ μκ² λ³κ²½λ μ μμΌλ―λ‘ μ μ€νκ² κ΄λ¦¬ν΄μΌ νλ€. | ||
κ°λ¨ν μν©μμλ `@State`λ§μΌλ‘ μΆ©λΆν μ μμΌλ©°, λ무 λΉλ²νκ² `@Binding`μ μ¬μ©νλ©΄ μ½λκ° λ³΅μ‘ν΄μ§ μ μμΌλ μ£Όμν΄μΌ νλ€. | ||
|
||
|
||
|
||
```swift | ||
// νμλ·°μ μν 곡μ μμ | ||
struct PlayerView: View { | ||
var episode: Episode | ||
@State private var isPlaying: Bool = false // Create the state here now. | ||
|
||
|
||
var body: some View { | ||
VStack { | ||
Text(episode.title) | ||
.foregroundStyle(isPlaying ? .primary : .secondary) | ||
PlayButton(isPlaying: $isPlaying) // Pass a binding. | ||
} | ||
} | ||
} | ||
|
||
struct PlayButton: View { | ||
@Binding var isPlaying: Bool // Play button now receives a binding. | ||
|
||
|
||
var body: some View { | ||
Button(isPlaying ? "Pause" : "Play") { | ||
isPlaying.toggle() | ||
} | ||
} | ||
} | ||
``` | ||
|
||
### `@ObservedObject` | ||
|
||
`@ObservedObject`λ `ObservableObject` νλ‘ν μ½μ μ€μνλ κ°μ²΄λ₯Ό κ΄μ°°νκ³ , ν΄λΉ κ°μ²΄μ μνκ° λ³κ²½λ λλ§λ€ λ·°λ₯Ό μλμΌλ‘ μ λ°μ΄νΈ νλ€. | ||
μ£Όλ‘ λ·° λͺ¨λΈ ν¨ν΄μμ μ¬μ©λλ©°, λ·°μ λ°μ΄ν° λ‘μ§μ λΆλ¦¬νλ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* λ·°μ λ°μ΄ν° λ‘μ§μ λΆλ¦¬νκ³ μ¬λ¬ λ·°μμ 곡μ λλ μνλ₯Ό κ΄λ¦¬ν λ μ¬μ©νλ€. | ||
* μλ₯Ό λ€μ΄ λ€νΈμν¬ μμ²μ κ²°κ³Όλ₯Ό μ μ₯νκ³ κ΄λ¦¬νλ λ·° λͺ¨λΈμ λ·°μμ μ°Έμ‘°ν λ `@ObservedObject`λ₯Ό μ¬μ©νλ€. | ||
* λ°μ΄ν° λͺ¨λΈμ΄λ μλΉμ€ κ°μ²΄μ μν λ³νλ₯Ό λ·°μμ κ°μ§νκ³ μλμΌλ‘ UIλ₯Ό μ λ°μ΄νΈν΄μΌ ν λ μ¬μ©λλ€. | ||
|
||
`@ObservedObject`λ λ·°κ° κ°ν μ°Έμ‘°λ₯Ό κ°μ§μ§ μμΌλ―λ‘ λ·°κ° μλ©ΈλλλΌλ κ°μ²΄κ° ν΄μ λμ§ μλ λ©λͺ¨λ¦¬ λμμ μ£Όμν΄μΌ νλ€. `@ObservedObject`λ‘ μ¬μ©λ κ°μ²΄λ λ€λ₯Έ κ³³μμ κ°νκ² μ°Έμ‘°λμ΄μΌ νλ€. | ||
λ°μ΄ν°κ° μμ£Ό λ³κ²½λλ κ²½μ° μ μ ν λκΈ°ν μμ΄ μ¬λ¬ λ·°μμ λμμ μνκ° μ λ°μ΄νΈλλ©΄ μΆ©λμ΄ λ°μν μ μλ€. | ||
|
||
`@ObservedObject`λ `@State`μ λ€λ₯΄κ² ν΄λμ€ νμ μμ μ¬μ©λλ€. | ||
|
||
```swift | ||
class DataModel: ObservableObject { | ||
@Published var name = "Some Name" | ||
@Published var isEnabled = false | ||
} | ||
|
||
|
||
struct MyView: View { | ||
@StateObject private var model = DataModel() | ||
|
||
|
||
var body: some View { | ||
Text(model.name) | ||
MySubView(model: model) | ||
} | ||
} | ||
|
||
|
||
struct MySubView: View { | ||
@ObservedObject var model: DataModel | ||
|
||
|
||
var body: some View { | ||
Toggle("Enabled", isOn: $model.isEnabled) | ||
} | ||
} | ||
``` | ||
|
||
### `@Published` | ||
|
||
`@Published`λ `ObservableObject` νλ‘ν μ½μ λ°λ₯΄λ ν΄λμ€ λ΄μμ νΉμ νλ‘νΌν°κ° λ³κ²½λμμ λ ν΄λΉ λ³κ²½μ μλ¦¬κ³ μ΄λ₯Ό κ΄μ°°νκ³ μλ λ·°κ° μλμΌλ‘ μ λ°μ΄νΈλ μ μλλ‘ ν΄μ€λ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* λ·° λͺ¨λΈ ν¨ν΄μμ `@ObservedObject`μ ν¨κ» μ¬μ©νμ¬ λ·°κ° λ°μ΄ν° λͺ¨λΈμ νΉμ νλ‘νΌν° λ³κ²½μ λ°μνλλ‘ ν λ μ¬μ©νλ€. | ||
* μλ₯Ό λ€μ΄ λ€νΈμν¬ μλ΅μ΄λ μ¬μ©μ μ λ ₯μ λ°λΌ λμ μΌλ‘ λ³νλ λ°μ΄ν°λ₯Ό κ΄λ¦¬ν λ μ μ©νλ€. | ||
|
||
`@Published`λ‘ μ μΈλ νλ‘νΌν°λ νμ λ·°λ₯Ό μ λ°μ΄νΈ νλ―λ‘ λΉλ²ν λ³κ²½μ΄ λ°μνλ κ²½μ° λΆνμν λ·° μ λ°μ΄νΈκ° λ°μν μ μλ€. λ°λΌμ μ±λ₯ λ¬Έμ κ° λ°μν μ μμΌλ―λ‘ κΌ νμν κ²½μ°μλ§ `@Published`λ₯Ό μ¬μ©ν΄μΌ νλ€. | ||
λν `@Published`λ ν΄λμ€ νμ μ νλ‘νΌν°μλ§ μ¬μ©λλ©° κ°νμ μμλ μ¬μ©ν μ μλ€. | ||
|
||
### `@StateObject` | ||
|
||
`@StateObject`λ SwiftUIμμ μν κ°μ²΄(ObservableObject)λ₯Ό κ΄λ¦¬νλ λ° μ¬μ©λλ νλ‘νΌν° λνΌλ€. `@StateObject`λ νΉμ λ·°μ μλͺ μ£ΌκΈ° λμ κ°μ²΄μ μνλ₯Ό μ μ§νκ³ , μ΄ κ°μ²΄μ μνκ° λ³κ²½λλ©΄ λ·°λ₯Ό λ€μ λ λλ§νλ€. `@StateObject`λ λ·°κ° μ²μ μ΄κΈ°νλ λ ν λ²λ§ κ°μ²΄λ₯Ό μμ±νλ©°, λ·°κ° λ€μ μμ±λ λλ λμΌν κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μ¬μ©νλ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* λ·°κ° μν κ°μ²΄μ μλͺ μ£ΌκΈ°λ₯Ό μμ νκ³ κ΄λ¦¬ν΄μΌ ν λ `@StateObject`λ₯Ό μ¬μ©νλ€. | ||
* μλ₯Ό λ€μ΄, λ·°κ° νΉμ λ°μ΄ν° λͺ¨λΈμ μνλ₯Ό μ§μ κ΄λ¦¬ν΄μΌ νκ±°λ, λ·°κ° μλ©Έλ λ μν κ°μ²΄λ ν¨κ» μλ©Έλμ΄μΌ νλ κ²½μ°μ μ ν©νλ€. | ||
|
||
`@StateObject`λ λ·°μ μ΄κΈ°ν μμ μ ν λ²λ§ κ°μ²΄λ₯Ό μμ±νλ―λ‘, `@StateObject`λ‘ μ μΈλ κ°μ²΄λ λ·°μ κ΅¬μ‘°κ° λ³κ²½λμ΄λ λμΌν μΈμ€ν΄μ€κ° μ μ§λλ€. λ§μ½ λ·° κ³μΈ΅μ λ€λ₯Έ κ³³μμ λμΌν κ°μ²΄λ₯Ό μ°Έμ‘°νλ €κ³ νλ©΄, `@ObservedObject`λ₯Ό μ¬μ©ν΄μΌ νλ€. | ||
|
||
κ°μ μν κ°μ²΄λ₯Ό μ¬λ¬ λ·°μμ κ΄λ¦¬ν΄μΌ ν λλ `@StateObject`μ `@ObservedObject`λ₯Ό νΌμ©νμ§ μλλ‘ μ£Όμν΄μΌ νλ€. κ°μ²΄μ μλͺ μ£ΌκΈ°μ λ©λͺ¨λ¦¬ κ΄λ¦¬μ νΌλμ μ΄λν μ μλ€. | ||
|
||
`@StateObject`λ SwiftUI 2.0μμ λμ λμμΌλ©°, λ·°κ° κ°μ²΄μ μλͺ μ£ΌκΈ°λ₯Ό μ± μμ ΈμΌ νλ μν©μμ λ§€μ° μ μ©νλ€. νΉν λ·°κ° μν κ°μ²΄λ₯Ό μ²μλΆν° μμ νκ³ κ΄λ¦¬ν΄μΌ νλ 볡μ‘ν μ ν리μΌμ΄μ μμ μ€μν μν μ νκ² λλ€. | ||
|
||
`@StateObject`λ μΌλ°μ μΌλ‘ λ·°κ° μ²μ μμ±λ λ μ¬μ©νλ κ²μ΄ μ’μΌλ©°, μ΄λ―Έ μμ±λ μν κ°μ²΄λ₯Ό λ€λ₯Έ λ·°μμ μ¬μ©ν λλ `@ObservedObject`λ₯Ό μ¬μ©νλ€. | ||
|
||
>`@StateObject`λ `@ObservedObject`μ λΉμ·ν΄ 보μ΄μ§λ§, μ€μν μ°¨μ΄μ μ κ°μ²΄μ μλͺ μ£ΌκΈ°μ μ΄κΈ°ν λ°©μμ μλ€. | ||
>`@StateObject`λ λ·°κ° μν κ°μ²΄λ₯Ό μμ νκ³ κ΄λ¦¬νλ λ° μ΄μ μ λ§μΆλ©°, νΉμ λ·°μ μλͺ μ£ΌκΈ° λμ μν κ°μ²΄κ° μ μ§λλλ‘ λ³΄μ₯νλ€. | ||
### `@EnvironmentObject` | ||
|
||
`@EnvironmentObject`λ `ObservableObject` νλ‘ν μ½μ λ°λ₯΄λ κ°μ²΄λ₯Ό λ·° κ³μΈ΅ ꡬ쑰 μ λ°μ κ±Έμ³ κ³΅μ νλ λ° μ¬μ©λλ€. SwiftUIμμ νκ²½μ μν΄ μ£Όμ λ κ°μ²΄λ `@EnvironmentObject`λ‘ μ°Έμ‘°ν μ μμΌλ©°, μ΄λ₯Ό ν΅ν΄ μ±μ μ¬λ¬ λΆλΆμμ 곡ν΅λ μνλ₯Ό μ¬μ©ν μ μλ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* μ±μ μ¬λ¬ λΆλΆμμ 곡ν΅λ μνλ₯Ό 곡μ νκ³ κ΄λ¦¬ν΄μΌ ν λ μ¬μ©νλ€. | ||
* μλ₯Ό λ€μ΄ μ¬μ©μ μΈμ¦ μν, μ μ μ€μ , κ³΅ν΅ λ°μ΄ν° μμ€ λ±μ `@EnvironmentObject`λ‘ κ΄λ¦¬ν μ μλ€. | ||
* κ³μΈ΅μ΄ κΉμ λ·° ꡬ쑰μμ μμλ·°μμ νμλ·°λ‘ μνλ₯Ό κ³μ μ λ¬νλ λμ `@EnvironmentObject`λ₯Ό μ¬μ©ν΄ κ°νΈνκ² μνλ₯Ό μ λ¬ν μ μλ€. | ||
|
||
`@EnvironmentObject`λ λ·° κ³μΈ΅μ μμμμ μ£Όμ λμ΄μΌ νλ€. λ§μ½ ν΄λΉ κ°μ²΄κ° μ£Όμ λμ§ μμ νμλ·°μμ μ΄λ₯Ό μ¬μ©νλ €κ³ νλ©΄, λ°νμ μλ¬κ° λ°μν μ μλ€. | ||
λν κ°μ²΄κ° νμν λ·°λ€μ λͺ μμ μΌλ‘ μ£Όμ λλλ‘ μ κ²½μ¨μΌ νλ©°, λͺ μμ μΌλ‘ μ μΈλμ§ μμ `@EnvironmentObject`λ λ·°μμ μλμΉ μκ² λμν μ μλ€. | ||
|
||
### `@Environment` | ||
|
||
`@Environment`λ μμ€ν μμ μ 곡νλ λ€μν κ°λ€μ λ·°μμ μ κ·Όν μ μκ² ν΄μ£Όλ νλ‘νΌν° λνΌλ€. μλ₯Ό λ€μ΄ μμ ν λ§, μ¬μ©μμ μ κ·Όμ± μ€μ , λ μ΄μμ λ°©ν₯ λ±μ `@Environment`λ₯Ό ν΅ν΄ κ°μ Έμ¬ μ μλ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* μ¬μ©μμ μμ€ν μ€μ μ λ°λΌ UI λμμ΄λ μ€νμΌμ λ³κ²½ν΄μΌ ν λ μ¬μ©λλ€. | ||
* μλ₯Ό λ€μ΄ λ€ν¬λͺ¨λμ λΌμ΄νΈ λͺ¨λμ λ°λΌ μμμ μ‘°μ νκ±°λ μ κ·Όμ± μ€μ μ λ°λΌ ν μ€νΈ ν¬κΈ°λ₯Ό λ³κ²½ν΄μΌ ν λ μ μ©νλ€. | ||
|
||
`@Environment`λ₯Ό μ¬μ©νμ¬ μμ€ν νκ²½μ μμ‘΄νλ UIλ₯Ό λ§λ€ λλ ν΄λΉ κ°μ΄ νμ μμλλ‘ μ 곡λλμ§ νμΈμ΄ νμνλ€. μλ₯Ό λ€μ΄ νΉμ νκ²½ κ°μ ν μ€νΈλ νΉμ μν©μμ λ€λ₯΄κ² μ€μ λ μ μλ€. | ||
|
||
λν λ무 λ§μ `@Environment` κ°μ μ¬μ©νλ©΄ μ½λκ° λ³΅μ‘ν΄μ§κ³ κ΄λ¦¬κ° μ΄λ €μμ§ μ μμ΄ κ³Όλν μ¬μ©μ νΌν΄μΌνλ€. | ||
|
||
```swift | ||
@Environment(\.colorScheme) var colorScheme: ColorScheme | ||
|
||
if colorScheme == .dark { // Checks the wrapped value. | ||
DarkContent() | ||
} else { | ||
LightContent() | ||
} | ||
``` | ||
|
||
### `@AppStorage` | ||
|
||
`@AppStorage`λ iOSμ UserDefaultsλ₯Ό μ¬μ©νμ¬ κ°μ μ μ₯νκ³ , μ΄ κ°μ μλμΌλ‘ κ΄λ¦¬νλ νλ‘νΌν° λνΌλ€. μ΄ λνΌλ κ°λ¨ν κ°μ μ± μ μμμ μ§μμ μΌλ‘ μ μ§νκ³ , μ±μ΄ μ¬μμλλλΌλ κ·Έ κ°μ μ μ§ν μ μκ² ν΄μ€λ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* μ¬μ©μκ° μ€μ ν κ°λ¨ν κ°μ μ μ₯νκ³ , μ±μ΄ λ€μ μμλμμ λλ ν΄λΉ κ°μ μ μ§νκ³ μΆμ λ μ¬μ©νλ€. | ||
* μλ₯Ό λ€μ΄, μ¬μ©μ ν λ§ μ€μ , λ‘κ·ΈμΈ μν, λλ μΈμ΄ μ€μ μ `@AppStorage`λ₯Ό ν΅ν΄ κ΄λ¦¬ν μ μλ€. | ||
|
||
`@AppStorage`λ UserDefaultsμ λ°μ΄ν°λ₯Ό μ μ₯νλ―λ‘, λ무 λ§μ λ°μ΄ν°λ 볡μ‘ν κ°μ²΄λ₯Ό μ μ₯νλ λ° μ ν©νμ§ μλ€. ν° λ°μ΄ν°λ 볡μ‘ν ꡬ쑰λ₯Ό μ μ₯ν κ²½μ° λ€λ₯Έ μμμ± λ©μ»€λμ¦μ κ³ λ €ν΄μΌ νλ€. | ||
|
||
λν `@AppStorage`λ κΈ°λ³Έ λ°μ΄ν° νμ λ§ μ§μνλ€. 볡μ‘ν λ°μ΄ν° ꡬ쑰λ μ¬μ©μ μ μ κ°μ²΄λ Codableμ μ¬μ©νμ¬ μ§μ μ§λ ¬ν/μμ§λ ¬ν ν΄μΌ νλ€. | ||
|
||
### `@SceneStorage` | ||
|
||
`@SceneStorage`λ νΉμ λ·°λ μ₯λ©΄(Scene)μ μνλ₯Ό μλμΌλ‘ μ μ₯νκ³ λ³΅μν μ μλ νλ‘νΌν° λνΌλ€. μ΄λ iOSμμ μ±μ΄ μ¬λ¬ μ₯λ©΄μ κ°μ§ μ μκ² λμμ λ λμ λ κ°λ μΌλ‘, κ° μ₯λ©΄μ κ΅νλ μνλ₯Ό μ μ§νλ λ° μ μ©νλ€. | ||
|
||
* μΈμ μ¬μ©ν΄μΌ ν κΉ? | ||
* μ¬μ©μκ° νΉμ νλ©΄μμ μ λ ₯νλ λ°μ΄ν°λ₯Ό μ μ§νκ±°λ, μ₯λ©΄μ΄ λ€μ νμ±νλμμ λ μ΄μ μνλ₯Ό 볡μν΄μΌ νλ κ²½μ°μ μ¬μ©λλ€. | ||
* μλ₯Ό λ€μ΄, μ λ ₯νλ ν μ€νΈ νλμ κ°μ μ μ₯νκ³ , μ₯λ©΄μ΄ λ€μ νμ±νλμμ λ μ΄λ₯Ό 볡μν μ μλ€. | ||
|
||
`@SceneStorage`λ μ₯λ©΄(Scene)μ΄ μλ©Έλλ©΄ ν΄λΉ μνλ μ¬λΌμ§ μ μλ€. μ₯κΈ°μ μΈ μν μ μ₯μ΄ νμν κ²½μ°μλ λ€λ₯Έ νλ‘νΌν° λνΌλ₯Ό κ³ λ €ν΄μΌ νλ€. | ||
λ§μ½ μ±μ΄ μκΈ°μΉ μκ² μ’ λ£λκ±°λ, μ₯λ©΄μ΄ μμ ν μ κ±°λλ©΄ `@SceneStorage`μ μ μ₯λ λ°μ΄ν°κ° μμ€λ μ μλ€. | ||
|
||
--- | ||
|
||
|
||
# μ°Έκ³ λ§ν¬ | ||
|
||
|
||
- [https://developer.apple.com/documentation/swiftui/state](https://developer.apple.com/documentation/swiftui/state) | ||
- [https://developer.apple.com/documentation/swiftui/binding](https://developer.apple.com/documentation/swiftui/binding) | ||
- [https://developer.apple.com/documentation/swiftui/observedobject](https://developer.apple.com/documentation/swiftui/observedobject) | ||
- [https://developer.apple.com/documentation/combine/published](https://developer.apple.com/documentation/combine/published) | ||
- [https://developer.apple.com/documentation/swiftui/stateobject](https://developer.apple.com/documentation/swiftui/stateobject) | ||
- [https://developer.apple.com/documentation/swiftui/environmentobject](https://developer.apple.com/documentation/swiftui/environmentobject) | ||
- [https://developer.apple.com/documentation/swiftui/environment](https://developer.apple.com/documentation/swiftui/environment) | ||
- [https://developer.apple.com/documentation/swiftui/appstorage](https://developer.apple.com/documentation/swiftui/appstorage) | ||
- [https://developer.apple.com/documentation/swiftui/scenestorage](https://developer.apple.com/documentation/swiftui/scenestorage) |