SwiftUI

  1. ๏ปฟ๏ปฟ@State: ๋ทฐ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋กœ์ปฌ ์ƒํƒœ๊ฐ’์„ ์ €์žฅ.

  2. ๏ปฟ๏ปฟ๏ปฟ@Binding: ๋ถ€๋ชจ ๋ทฐ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง.

  3. ๏ปฟ๏ปฟ@observedObject: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ.

  4. ๏ปฟ๏ปฟ@Environmentobject: ์•ฑ ์ „์ฒด์—์„œ ๊ณต์œ ๋˜๋Š” ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ.

  5. ๏ปฟ๏ปฟ@Published:ObservableObject์˜ ์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ View๋ฅผ ์ž๋™ ๋ฆฌํ”„๋ ˆ์‹œ

  6. ๏ปฟ๏ปฟ@AppStorage: UserDefaults์— ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉ.

  7. ๏ปฟ๏ปฟ๏ปฟ@SceneStorage: ์•ฑ์˜ 'Scene' ์„ธ์…˜ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ.

  8. ๏ปฟ๏ปฟ@Environment: ์‹œ์Šคํ…œ ์ œ๊ณต ํ™˜๊ฒฝ ์„ค์ •์— ์ ‘๊ทผ.

  9. ๏ปฟ๏ปฟ@StateObject: ๋ทฐ๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ.

  10. @FetchRequest: Core Data์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ์— ์—ฐ๊ฒฐ.

0. Property Wrapper (ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ)

โ€ข ์˜๋ฏธ: ์†์„ฑ(property)์— ์ถ”๊ฐ€์ ์ธ ํ–‰๋™์ด๋‚˜ ๊ณ„์‚ฐ์„ ๋ง๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ตฌ์กฐ.

ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋กœ์ง์ด๋‚˜ ๊ณ„์‚ฐ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ด

1. @State

  • ๏ปฟ๏ปฟ์ •์˜: ๋กœ์ปฌ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ด€๋ฆฌ (๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ)

  • ๏ปฟ๏ปฟ์žฅ์ : ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›€.

  • ๏ปฟ๏ปฟ๋‹จ์ : ํ•ด๋‹น View ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: View์˜ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ.

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ์ƒํƒœ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถ”์ ํ•˜๊ณ  ๋น„๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๋ ค๊ณ 

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: View ๋‚ด๋ถ€์—์„œ @State ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ

@State private var count = 0

์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ

struct CounterView: View {
    @State private var count = o
    
    var body: some View {
        Button ("์นด์šดํŠธ ์ฆ๊ฐ€") {
        count += 1
        Text("ํ˜„์žฌ ์นด์šดํŠธ: 1(count)")
    }
}

2. @Binding

  • ๏ปฟ๏ปฟ์ •์˜: ์ƒ์œ„ View์˜ ์ƒํƒœ๋ฅผ ํ•˜์œ„ View์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘

  • ๏ปฟ๏ปฟ์žฅ์ : ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„๊ฐ€๋Šฅ

  • ๏ปฟ๏ปฟ๋‹จ์ : ์ƒ์œ„ View์™€ ํ•˜์œ„ View๊ฐ€ ์ƒํƒœ์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: ์ƒ์œ„ View์˜ ์ƒํƒœ๋ฅผ ํ•˜์œ„ View์—์„œ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ.

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ์ƒํƒœ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ๊ด€๋ฆฌ

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: ํ•˜์œ„ View์—์„œ @Binding ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ƒ์œ„ View์—์„œ ์—ฐ๊ฒฐ

@Binding var isOn: Bool

์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ

struct SwitchView: View {
    @Binding var isOn: Bool
    
    var body: some View {
        Toggle("์Šค์œ„์น˜", isOn: $isOn)
    }
}

3. @ObservedObject

  • ๏ปฟ๏ปฟ์ •์˜: ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ View์— ๋ฐ”์ธ๋”ฉ

  • ๏ปฟ๏ปฟ์žฅ์ : ์—ฌ๋Ÿฌ View์—์„œ ๊ณต์œ  ๊ฐ€๋Šฅ

  • ๏ปฟ๏ปฟ๋‹จ์ : Observableobject ํ”„๋กœํ† ์ฝœ์„ ์ ์šฉํ•œ ๋ณ„๋„์˜ ํด๋ž˜์Šค ํ•„์š”.

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ •๋ณด๋‚˜ ๋ณต์žกํ•œ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•  ๋•Œ ์—ฌ๋ŸฌView์—์„œ ๊ณต์œ ํ• ๋•Œ ์‚ฌ์šฉ ( ex. ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ •๋ณด์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ)

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•จ!

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: @observedobject ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ObservableObject๋ฅผ ์ ์šฉํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉ

@Observedobject var viewModel: MyViewModel

์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ

struct MyView: View {
    @Observedobject var viewModel: MyViewModel
    
    var body: some View {
        Text (viewModel.title)
    }
}

4. @EnvironmentObject

  • ๏ปฟ๏ปฟ์ •์˜: ์•ฑ ์ „์ฒด์—์„œ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃธ!

  • ๏ปฟ๏ปฟ์žฅ์ : ์•ฑ ์ „์ฒด์˜ ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

  • ๏ปฟ๏ปฟ๋‹จ์ : ๋ช…์‹œ์ ์ธ ์ดˆ๊ธฐํ™”๊ฐ€ ์—†์œผ๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ.

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: ์•ฑ ์ „์ฒด์—์„œ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ, ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ํฐ ์ •๋ณด ๋‹ด์„๋•Œ ์‚ฌ์šฉ (ex.๋กœ๊ทธ์ธ ์ƒํƒœ, ํ…Œ๋งˆ ์„ค์ •)

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ์•ฑ ์ „์ฒด์˜ ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: @EnvironmentObject ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ

@EnvironmentObject var appData: AppData

์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ

struct ContentView: View {
    @EnvironmentObject var appData: AppData
    
    var body: some View {
        Text("์ „์ฒด ์‚ฌ์šฉ์ž ์ˆ˜: V(appData.totaLusers)")
    }
}

@State, @ObservedObject, @EnvironmentObject ์ฐจ์ด์ 

โ€ข ๋ชจ๋‘ SwiftUI์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

@State, @Observedobject, @EnvironmentObject ์ฐจ์ด์ 

  1. ๋ฒ”์œ„: @State๋Š” ํ•˜๋‚˜์˜ View, @0bservedobject๋Š” ์—ฌ๋Ÿฌ View, @EnvironmentObject๋Š” ์•ฑ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ

  2. ๋ณต์žก์„ฑ: @State๋Š” ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ, @observedObject์™€ @Ervironmentobject๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ!

@Observedobject์™€ @EnvironmentObject ๊ณตํ†ต์ 

์ƒํƒœ ๊ด€๋ฆฌ ๊ฐ์ฒด๋ฅผ View์™€ ์—ฐ๊ฒฐ

@Observedobject์™€ @EnvironmentObject ์ฐจ์ด์ 

@observedObject ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋ฉฐ, @Environmentobject๋Š” ์•ฑ ์ „์ฒด์— ์ฃผ์ž… ๋œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์Œ

@State์™€ @Binding ๊ณตํ†ต์ 

์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ

@State์™€ @Binding ์ฐจ์ด์ 

์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฆ„. @State๋Š” View ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ, @Binding์€ ์ƒ์œ„ View์™€ ํ•˜์œ„ View ์‚ฌ์ด์—์„œ ์ƒํƒœ๋ฅผ ๊ณต์œ 

5. @Published

  • ๏ปฟ๏ปฟ์ •์˜: ObservableObject์˜ ์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ View๋ฅผ ์ž๋™์œผ๋กœ ๋ฆฌํ”„๋ ˆ์‹œ(ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด "์—ฌ๊ธฐ ๋ณ€ํ–ˆ์–ด์š”! ๋ทฐ ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ์„ธ์š”!"๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• )

  • ๏ปฟ๏ปฟ์žฅ์ : ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐ, ObservableObject์™€ ์ž˜ ์—ฐ๋™๋จ.

  • ๏ปฟ๏ปฟ๋‹จ์ : ํŠน์ • ์†์„ฑ์—๋งŒ ์ ์šฉ, ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: Observableobject์˜ ํŠน์ • ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋น„๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๋•Œ.

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  UI๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: @Published ์–ด๋…ธํ…Œ์ด์…˜์„ ์†์„ฑ ์•ž์— ์ถ”๊ฐ€!

  • ๏ปฟ๏ปฟ์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ

class Counter: ObservableObject {
    @Published var count = 0
    // ์ด ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ทฐ๋Š” ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋ฉ๋‹ˆ๋‹ค.
}

struct ContentView: View {
    @Observedobject var counter = Counter()
    
    var body: some View {
        Text("Count: \(counter.count)")
    }
}

@Published๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ทฐ์— ์•Œ๋ ค์ฃผ์–ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ฒŒ ํ•˜๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ๋„๊ตฌ

6. @AppStorage

  • ๏ปฟ๏ปฟ์ •์˜: ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์„ค์ •์„ ์‰ฝ๊ฒŒ ์ €์žฅํ•˜๊ณ  ์กฐํšŒ

  • ๏ปฟ๏ปฟ์žฅ์ : UserDefaults๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„ํŽธ

  • ๏ปฟ๏ปฟ๋‹จ์ : ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: ์‚ฌ์šฉ์ž ์„ค์ •์„ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•  ๋•Œ.

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ํ•„์š”ํ•  ๋•Œ ๋น ๋ฅด๊ณ  ํšจ์œจ์ 

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: @AppStorage ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์ €์žฅ ํ‚ค๋ฅผ ์ง€์ • @AppStorage ("user_name") var userName: String = "Guest"

์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ

struct ContentView: View {
    @AppStorage ("user_name") var userName: String = "Guest"
    
    var body: some View {
        Text("ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค, \(userName)")
    }
}

7. @SceneStorage

  • ๏ปฟ๏ปฟ์ •์˜: ์•ฑ์˜ ๋‹ค์–‘ํ•œ ์”ฌ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›

  • ๏ปฟ์žฅ์ : ์ƒํƒœ ๋ณต์›์ด ์‰ฌ์›€

  • ๏ปฟ๏ปฟ๋‹จ์ : ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ. (ํ…Œ์ดํ„ฐ ํƒ€์ž… ์ œํ•œ, ๋กœ์ปฌ ์ €์žฅ์ด๋ผ ์—ฌ ๋Ÿฌ ๋””๋ฐ”์ด์Šค๊ฐ„์˜ ์ƒํƒœ ๊ณต์œ X)

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: ์•ฑ์˜ ๋‹ค์–‘ํ•œ '์žฅ๋ฉด'๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ณต์œ ์‹œ ์‚ฌ์šฉ

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ๋‹ค์‹œ ์—ด์—ˆ์„ ๋•Œ ์ด์ „ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด.

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: @SceneStorage๋ฅผ ๋ณ€์ˆ˜ ์•ž์— ๋ถ™์—ฌ ์‚ฌ์šฉ

  • ๏ปฟ๏ปฟ์‚ฌ์šฉ ์˜ˆ: ํƒญ์˜ ์„ ํƒ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ

struct ContentView: View {
    @SceneStorage ("selectedTab") var selectedTab: String?
    var body: some View {
        TabView(selection: ยงselectedTab) {
            Text ("Tab 1")
                .tabItem {
                    Text ("Tab 1")
                ๏ฝ
                .tag("firstTab")
        
            Text ("Tab 2")
                .tabItem {
                    Text("Tab 2")
                }
                .tag ("secondTab" )
        }
    }
๏ฝ

์ฐธ๊ณ ๋กœ ์ด ์˜ˆ์‹œ์—์„œ, ํƒญ์˜ ์„ ํƒ ์ƒํƒœ๋Š” selectedTab ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๊ณ , ์•ฑ์ด ์ข…๋ฃŒ๋œ ํ›„ ๋‹ค์‹œ ์‹คํ–‰๋  ๋•Œ ์ด ์ƒํƒœ๋ฅผ ๋ณต์›

@AppStorage, @scenestorage ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

  • ๏ปฟ๏ปฟ๊ณตํ†ต์ : ๋‘˜ ๋‹ค ์•ฑ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • ๏ปฟ๏ปฟ์ฐจ์ด์ : @AppStorage๋Š” ์•ฑ ์ „์ฒด์— ๊ฑธ์ณ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋ฉฐ, @SceneStorage๋Š” ํŠน์ • Scene์—์„œ๋งŒ ๊ตญํ•œ๋œ ์ƒํƒœ๋ฅผ ์ €์žฅ

8. @Environment

  • ๏ปฟ๏ปฟ์ •์˜: ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ ์•ฑ ์„ค์ •์„ View๋กœ ์ฃผ์ž…

  • ๏ปฟ๏ปฟ์žฅ์ : ์ „์—ญ ์„ค์ •์„ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

  • ๏ปฟ๏ปฟ๋‹จ์ : ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ‚ค๊ฐ€ SwiftUI์— ์˜ํ•ด ์ œํ•œ๋จ.

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: ์‹œ์Šคํ…œ ์„ค์ •์„ View์—์„œ ํ•„์š”๋กœ ํ•  ๋•Œ.

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ์‹œ์Šคํ…œ ์„ค์ •์— ์‰ฝ๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด.

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: @Environment ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ํŠน์ • ํ‚ค๋ฅผ ์‚ฌ์šฉ @Environment (l. locale) var locale

์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ

struct ContentView: View {
    @Environment (\. locale) var locale
    
    var body: some View {
        Text("ํ˜„์žฌ ๋กœ์ผ€์ผ: 1(Locale)")
    }
}

@AppStorage, @Environment ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

  • ๊ณตํ†ต์ : @AppStorage์™€ @Environment๋Š” ๋‘˜ ๋‹ค ์„ค์ • ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

  • ์ฐจ์ด์ : @AppStorage๋Š” ์‚ฌ์šฉ์ž ์„ค์ •์„ UserDefaults์— ์ €์žฅ, @Environment๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ์„ค์ •์„ ๊ฐ€์ ธ์˜ด

9. @StateObject

  • ๏ปฟ๏ปฟ์ •์˜: ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ง€๋Š” ์˜ต์ €๋ฒ„๋ธ” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ €์žฅ(SwiftuI์—์„œ ์ฐธ์กฐ ํƒ€์ž…์˜ ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์œ ํ•˜๊ณ  ๊ด€๋ฆฌ)

  • ๏ปฟ๏ปฟ์žฅ์ : ์ƒํƒœ ์†Œ์œ ๊ถŒ(์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์œ  ๋ฐ ๊ด€๋ฆฌ), ๋ฐ์ดํ„ฐ ๊ณต์œ (์—ฌ๋Ÿฌ ๋ทฐ์—์„œ ๊ณต ์œ  ๊ฐ€๋Šฅ)

  • ๋‹จ์ : ๋‹จ์ผ ๋ทฐ์—์„œ๋งŒ ์†Œ์œ  ํ•  ์ˆ˜ ์žˆ์Œ, ๋ฉ”๋ชจ๋ฆฌ๊ด€๋ฆฌ(๊ฐ์ฒด๊ฐ€ ๋ทฐ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜์žˆ์Œ)

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: ๋ทฐ์™€ ๋ทฐ ๊ณ„์ธต์—์„œ ๊ณต์œ ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ.

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: ๋ฐ์ดํ„ฐ์˜ ์†Œ์œ ๊ถŒ๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ ๋˜๋Š” ์ƒํƒœ๋ฅผ ๋ทฐ ๊ณ„์ธต ์— ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์„๋•Œ

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: @StateObject ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณ€์ˆ˜ ์•ž์— ๋ถ™์—ฌ ์‚ฌ์šฉ

  • ๏ปฟ๏ปฟ์‚ฌ์šฉ ์˜ˆ: viewModel์„ ๋ทฐ์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ ํ• ๋•Œ.

  • ๏ปฟ๏ปฟ์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ :

class Counter: ObservableObject {
    @Published var count = 0
}

struct ContentView: View {
    @StateObject var counter = Counter ()
    
    var body: some View {
        VStack {
            Text ('Count: \(counter. count)")
            Button ("Increment") {
                counter. count += 1
            }
        }
    }
}

@stateobject๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Counter๋ผ๋Š” ObservableObject๋ฅผ ContentView ๋‚ด์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์ œ

์ด ์˜ˆ์—์„œ Counter๋Š” ์ƒํƒœ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ํด๋ž˜์Šค์ด๋ฉฐ, @Published ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ count ๋ณ€์ˆ˜์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€.

ContentView๋Š” ์ด Counter ๊ฐ์ฒด๋ฅผ @StateObject๋กœ ์„ ์–ธํ•˜์—ฌ ๋ทฐ๊ฐ€ ์†Œ๋ฉธ๋˜์–ด ๋‹ค์‹œ ์ƒ์„ฑ๋  ๋•Œ์—๋„ Counter

๊ฐ์ฒด๊ฐ€ ์œ ์ง€๋˜๊ฒŒํ•จ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Counter์˜ ์ƒํƒœ๊ฐ€ ContentView์— ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ”์ธ๋”ฉ๋˜๊ณ , "Increment" ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด count ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ UI๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ

10. @FetchRequest

  • ๏ปฟ๏ปฟ์ •์˜: Core DataํŒจ์น˜ ์š”์ฒญ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”์ธ๋”ฉํ•จ

  • ๏ปฟ๏ปฟ์žฅ์ : Core Data ํ†ตํ•ฉ์ด ๋งค์šฐ ์‰ฌ์›€, ์ž๋™ ์—…๋ฐ์ดํŠธ(Core Data์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ž๋™ ๋ฐ˜ ์˜)

  • ๏ปฟ๏ปฟ๋‹จ์ : Core Data์—๋งŒ ํŠนํ™”๋˜์–ด ์žˆ์Œ(Only Core Data), ์ฟผ๋ฆฌ์ œํ•œ(๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์Œ)

  • ๏ปฟ๏ปฟ์–ธ์ œ ์‚ฌ์šฉ: Core Data๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰, ์ด๋ฅผ ๋ทฐ์— ํ‘œ์‹œํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ

  • ๏ปฟ๏ปฟ์™œ ์‚ฌ์šฉ: Core Data ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  ๋น„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด

  • ๏ปฟ๏ปฟ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ: @FetchRequest ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณ€์ˆ˜ ์•ž์— ๋ถ™์—ฌ ์‚ฌ์šฉ

  • ๏ปฟ๏ปฟ์‚ฌ์šฉ ์˜ˆ: Core Data์˜ ์—”ํ„ฐํ‹ฐ ๋ชฉ๋ก์„ ํ…Œ์ด๋ธ” ๋ทฐ์— ํ‘œ์‹œํ•  ๋•Œ

  • ๏ปฟ๏ปฟ์‚ฌ์šฉ ์˜ˆ์‹œ์ฝ”๋“œ

import SwiftuI
import CoreData

struct ContentView: View {
    @FetchRequest (sortDescriptors: [NSSortDescriptor (keyPath: \Item. timestamp, ascending:
    animation: . default)
    private var items: FetchedResults<Item>
    
    var body: some View {
        List {
        ForEach(items) { item in
            Text("Item at \(item.timestamp!, formatter: itemFormatter)")
        }
    }
}

๋‹ค๋ฅธ ์˜ต์…˜๊ณผ์˜ ์ฐจ์ด์ 

  • @Observedobject์™€์˜ ์ฐจ์ด์ 

    • @ObservedObject๋Š” ์ผ๋ฐ˜์ ์ธ ObservableObject๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, @FetchRequest๋Š” Core Data ์™€ ํŠนํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • @StateObject๊ณผ @FetchRequest์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

    • ๏ปฟ๏ปฟ๊ณตํ†ต์ : ๋‘˜ ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

    • ๏ปฟ๏ปฟ์ฐจ์ด์ : @StateObject์€ ์ผ๋ฐ˜์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ์— ์‚ฌ์šฉ, @FetchRequest๋Š” Core Data์™€ ํŠนํ™”๋จ


๋ฐ์ดํ„ฐ์˜ ์†Œ์œ ์™€ ๋ฒ”์œ„

  • ๏ปฟ๏ปฟ์ƒํƒœ ๊ด€๋ฆฌ(@State, @Binding, @observedobject, @Stateobject, @Environmentobject): ์ด๋“ค์€ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ทฐ์™€ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ์—ญํ• 

  • ๏ปฟ๏ปฟ๋ฐ์ดํ„ฐ ์ €์žฅ(@Appstorage, @Scenestorage): ์ด ๋‘ ๋ž˜ํผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์—ญํ• 

  • ๏ปฟ๏ปฟ์‹œ์Šคํ…œ ์ •๋ณด ์ ‘๊ทผ(@Environment, @FetchRequest): ์ด๋“ค์€ ์•ฑ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์ด๋‚˜ ์™ธ ๋ถ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋‹ด๋‹น

์•Œ๋ฆผ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • ๏ปฟ๏ปฟ์ž๋™ ์•Œ๋ฆผ(@State, @Published, @observedobject, @Environmentobject, @StateObject): ์ด๋“ค์€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ

  • ๏ปฟ๏ปฟ๋ช…์‹œ์  ์•Œ๋ฆผ(@Binding, @Environment, @FetchRequest, @AppStorage, @SceneStorage): ์ด๋“ค์€ ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์™ธ๋ถ€ ์š”์ธ(์‚ฌ์šฉ์ž ์•ก์…˜, ์‹œ์Šคํ…œ ์„ค์ • ๋“ฑ)์— ์˜์กดํ•˜๋ฉฐ, ๋ทฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ

๋ฐ์ดํ„ฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ

  • ๏ปฟ๏ปฟ๋ทฐ ์ƒ๋ช…์ฃผ๊ธฐ(@State, @Binding, @observedobject): ์ด ๋ž˜ํผ๋“ค์€ ๋ทฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€

  • ๏ปฟ๏ปฟ์•ฑ ์ƒ๋ช…์ฃผ๊ธฐ(@Appstorage, @SceneStorage, @Environmentobject, @StateObject): ์ด ๋ž˜ํผ๋“ค์€ ์•ฑ์ด๋‚˜ ์”ฌ(scene)์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€

๋ฐ์ดํ„ฐ ์†Œ์Šค

  • ๏ปฟ๏ปฟ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ(@State, @Binding, @observedobject, @Stateobject): ์ด๋“ค์€ ์ฃผ ๋กœ ์•ฑ ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃธ

  • ๏ปฟ๏ปฟ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ(@Environment, @FetchRequest, @AppStorage, @SceneStorage, @Environmentobject): ์ด๋“ค์€ ์ฃผ๋กœ ์•ฑ ์™ธ๋ถ€(์‹œ์Šคํ…œ ์„ค์ •, ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ ๋“ฑ)์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃธ!

Published์˜ ์‚ฌ์šฉ

@Published ์†์„ฑ์— ๋Œ€ํ•œ $ ์‚ฌ์šฉ์˜ ์œ ๋ฌด๋Š” ๊ทธ ์†์„ฑ์— ์ง์ ‘ ์ ‘๊ทผํ•  ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๊ทธ ์†์„ฑ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•  ๊ฒƒ์ธ์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

  • With $: @Published ์†์„ฑ์˜ Publisher์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, viewModel.$name์€ Published<String>.Publisher ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ด Publisher๋Š” ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐ(subscribe)ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜์‘ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • Without $: @Published ์†์„ฑ์˜ ์‹ค์ œ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, viewModel.name์€ String ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜

Last updated