Notice
Recent Posts
Recent Comments
Link
ยซ   2024/07   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[SwiftUI] State and Data Flow ๋ณธ๋ฌธ

apple/๐Ÿš SwiftUI & Combine

[SwiftUI] State and Data Flow

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2022. 6. 2. 17:14

State and Data Flow

 

 

โœ… ์•„๋ž˜์˜ ๋ฌธ์„œ ์ค‘ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๊ณจ๋ผ์„œ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://developer.apple.com/documentation/swiftui/state-and-data-flow

 

Apple Developer Documentation

 

developer.apple.com

 

๊ณต์‹๋ฌธ์„œ์˜ ์„ค๋ช…

 

SwiftUI๋Š” user interface ๋””์ž์ธ์„ ์„ ์–ธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. (์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ) ๋”ฐ๋ผ์„œ view๋ฅผ ๊ณ„์ธต์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ๋•Œ views๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋„ ์ข…์†์„ฑ๋„ ํ‘œ์‹œํ•œ๋‹ค. ์™ธ๋ถ€ ์ด๋ฒคํŠธ ํ˜น์€ user๊ฐ€ ์ทจํ•˜๋Š” ์•ก์…˜์— ์˜ํ•ด ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ, SwiftUI์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ถ€๋ถ„์„ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ํ”„๋ ˆ์ž„์›Œํฌ(SwiftUI)๋Š” ์ „ํ†ต์ ์œผ๋กœ viewController์—์„œ ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์‰ฝ๊ฒŒ ๋งํ•ด์„œ SwiftUI์—์„œ๋Š” MVVM ํŒจํ„ด์—์„œ ViewController์˜ ์—ญํ• ์„ ๋Œ€๋ถ€๋ถ„ ๊ฐ€์ ธ๊ฐ„๋‹ค๊ณ  ๋ด„.

 

โœ… SwiftUI์—๋Š” @State ๋ฐ @Binding์„ ์ œ๊ณตํ•˜์—ฌ user interface์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค์€ ์•ฑ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋‹จ์ผ ์†Œ์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ๋ฉฐ, ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋กœ์ง์˜ ์–‘์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. 

(ํด๋กœ์ €๋‚˜ delegate ํ˜น์€ notification ๋“ฑ์„ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋˜ ๊ธด ๋กœ์ง์„ RxSwfit๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํฌ๊ฒŒ ์ค„์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ด์™€ ๊ฐ™์€ ์ด์•ผ๊ธฐ!)

 

 

โœ… ์• ํ”Œ ๊ณต์‹๋ฌธ์„œ์˜ ์„ค๋ช…!

์•„๋ž˜์— ์„ค๋ช…์„ ์ž์„ธํ•˜๊ฒŒ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ€์˜ ํ๋ฆ„์„ ์ฐจ๋ก€๋กœ ๋”ฐ๋ผ๊ฐ€๋ณด์ฃ !

์• ํ”Œ ๊ณต์‹๋ฌธ์„œ

 

 

 ๐ŸŸ  SwiftUI์˜ LifeCycle

 - SwiftUI์—๋Š” View์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‹จ ๋‘ ๊ฐœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 - ๋Œ€์‹  ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹ค์–‘ํ•œ Property Wrapper๊ฐ€ ์กด์žฌํ•ด Data ํ๋ฆ„์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ƒํƒœ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.onAppear {
    print("ViewAppeared") // viewDidAppear
}

.onDisappear {
    print("ViewDisappeared") 
}

 

 ๐ŸŸ  @State 

 - struct๋Š” value type์ด๋ผ์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋‚˜, SwiftUI์—์„œ @State๋ฅผ ์ œ๊ณตํ•ด strcut๋‚ด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 - mutating๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. swiftUI์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ View๋ฅผ struct๋กœ ์ƒ์„ฑํ•˜๋Š”๋ฐ ๊ฐ’์„ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” class๋กœ๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ UIRepesentView๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด final๋กœ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑด ๋‚ด๊ฐ€ ํ•ด๋ด์„œ ์ฐธ๊ณ !

 - ์ผ๋ฐ˜์ ์œผ๋กœ @State๋Š” private์œผ๋กœ ์„ ์–ธ๋˜๊ณ , ๋‹ค๋ฅธ view์™€ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 - ๋‹ค๋ฅธ view์™€ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, @StateObject๋‚˜ @ObservedObject๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๐ŸŸ  @Binding

 - @Binding์€ ๋ถ€๋ชจ view์˜ @State์™€ ๊ฐ™์€ ๊ฐ™์„ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

 - ์•„๋ž˜ ์ฝ”๋“œ์—์„œ isPresented๋Š” showAddView๋ฅผ ๋ฐ”์ธ๋”ฉ ์‹œ์ผœ์ค˜์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

 - @Binding์˜ ๊ฒฝ์šฐ์—๋Š” init์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๊ฐœ์ธ์ ์œผ๋กœ ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ init ์•ˆ์—์„œ .constant()๋กœ ์ดˆ๊ธฐ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

struct ContentView: View {
  @State private var showAddView = false

  var body: some View {
    VStack {
      Text("Hello World.")
    }
  }
  .sheet(isPresented: $showAddView) {
     AddView(isPresented: self.$showAddView)
  }
}

struct AddView: View {
  @Binding var isPresented: Bool

  var body: some View {
    Button("Dismiss") {
       self.isPresented = false
    }
  }
}

 

์—ฌ๊ธฐ๊นŒ์ง€๋Š” Combine์˜ ๊ฐœ๋…์„ ๋ชจ๋ฅด๋”๋ผ๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋‚ด๊ฐ€ ์ด ๊ธ€์„ ํฌ์ŠคํŒ…ํ•˜๋Š” ์ด์œ ๋„ ์—ฌ๊ธฐ๋ถ€ํ„ฐ์ธ๋ฐ, ํ”„๋กœ์ ํŠธ์—์„œ SwiftUI์— MVVM์„ ์ ์šฉํ•ด์„œ ViewModel์„ ๋ถ™์ด๋ ค๊ณ  ํ•  ๋•Œ ํ•œ๋ฒˆ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๊ปด์„œ๋‹ค.

 

 

๐ŸŸ  ObservableObject: Property Wrapper๊ฐ€ ์•„๋‹Œ protocol์ž…๋‹ˆ๋‹ค!!

๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „์— ๋ฐฉ์ถœํ•˜๋Š” publisher๊ฐ€ ๋ฐฉ์ถœํ•˜๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…

 - ObservableObejct๋Š” Protocol์ด๋ฉฐ, Combine ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

 - ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ , @Published๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 - @Published๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ view๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 - ObservableObject๋Š” MVVM ์•„ํ‚คํ…์ณ์˜ viewModel์— ์ ์šฉํ•˜๊ธฐ ์ข‹์€ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

 - ObservableObject protocol์€ ObservedObeject property wrapper๋ฅผ ์ด์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์ฐธ์กฐ ๋ชจ๋ธ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ‘‰ ์˜ˆ์‹œ์ฝ”๋“œ 1 (์• ํ”Œ ๊ณต์‹๋ฌธ์„œ)

class Contact: ObservableObject {
    @Published var name: String
    @Published var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    func haveBirthday() -> Int {
        age += 1
        return age
    }
}

let john = Contact(name: "John Appleseed", age: 24)
cancellable = john.objectWillChange // ๐ŸŸ  ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „์— ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค.
    .sink { _ in
        print("\(john.age) will change") 
     }
print(john.haveBirthday())
// Prints "24 will change"
// Prints "25"

๐Ÿ‘‰ ์˜ˆ์‹œ์ฝ”๋“œ 2 (์ฐธ๊ณ  ๋งํฌ)

์ด๋ ‡๊ฒŒ ๋ชจ๋ธ ์ž์ฒด๋ฅผ ๊ฑธ์–ด๋‘๋ฉด ๋”์šฑ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

class MyViewModel: ObservableObject {
  @Published var dataSource: MyModel
  
  init(dataSource: MyModel) {
    self.dataSource = dataSource
  }
}

 

๐ŸŸ  @StateObject

 - WWDC2020์—์„œ @StateObject๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

 - @ObservedObject์™€ ๊ฑฐ์˜ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

 - SwiftUI๊ฐ€ View๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•  ๋•Œ, ์‹ค์ˆ˜๋กœ ์ทจ์†Œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

 - view์—์„œ @StateObject๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

2022.06.02 - [iOS/SwiftUI] - [SwiftUI] @StateObject

 

[SwiftUI] @StateObject

@StateObject โœ… ์•„๋ž˜ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. https://developer.apple.com/documentation/swiftui/stateobject Apple Developer Documentation developer.apple.com ํŠน์„ฑ ์„ ์–ธ์— @StateObject ์†..

rldd.tistory.com

 

๐Ÿ‘‰ ์˜ˆ์‹œ์ฝ”๋“œ 

struct ContentView: View {
  @StateObject var user = User()
}

 

๐ŸŸ  @ObservedObject - ObservableObject๋ž‘ ๋‹ค๋ฆ…๋‹ˆ๋‹ค!!

๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์— ๊ตฌ๋…ํ•˜๊ณ , ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค view๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.(updateํ•œ๋‹ค๋Š” ๋œป)

 

 - SwiftUI๋Š” @ObservedObject๋ฅผ ํ†ตํ•ด view๊ฐ€ ์™ธ๋ถ€ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 - ์•„๋ž˜ ์ฝ”๋“œ์—์„œ User class๋Š” ObservableObject๋ฅผ ์ค€์ˆ˜ํ•˜๊ณ  @Published ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 - @ObservedObject์˜ user ๋ณ€์ˆ˜๋Š” ์ด๋Ÿฌํ•œ User class ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 - SwiftUI๋Š” ์ด๋Ÿฌํ•œ user ๊ฐ์ฒด์˜ @Published ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ view๋ฅผ refreshํ•ฉ๋‹ˆ๋‹ค.

 

class User: ObservableObject {
  @Published var name = "Hohyeon Moon"
}

struct ContentView: View {
  @ObservedObject var user = User()

  var body: some View {
    VStack {
      Text("Your name is \(user.name).")
    }
  }
}

 

๐ŸŸ  @EnvironmentObject

 - @EnvironObject๋Š” ๋ณดํ†ต ์•ฑ ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 - @EnvironObject๋Š” .environmnetObejct()๋ฅผ ํ†ตํ•ด ๊ฐ’์ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 - ์ „๋‹ฌํ•˜๋Š” Object๋Š” ObservableObject ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 - ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด rootView๋ฅผ ์ œ๊ณตํ•˜๋ฉด, ์–ด๋– ํ•œ view์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 - EnvironmentObject property wrapper๋ฅผ ํ†ตํ•ด์„œ environmnet์— ์ €์žฅ๋œ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”์ด์ƒ SceneDelegate๊ฐ€ default๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๐Ÿ‘‰ ์˜ˆ์‹œ์ฝ”๋“œ

import SwiftUI

// MySettings.swift
class Settings: ObservableObject {
  @Published var version = 0
}

@main
struct CombinePracticeApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(Settings())
        }
    }
}

struct ContentView: View {
    @EnvironmentObject var settings: Settings
    
    var body: some View {
        Text("Hello, world!")
            .padding()
        
        Button {
            settings.version += 1
        } label: {
            Text("version \(settings.version)")
        }

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

 

 

์—ฌ๊ธฐ์„œ ์ž ๊น! ObservableObject์™€ EnvironmentObject๊ฐ€ ๋น„์Šทํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ์ฐจ์ด๋ฅผ ์งš์–ด๋ณด์ž.

EnvironmentObject์˜ ์„ค๋ช…์€ StateObject์— ๋„ฃ์–ด๋‘์—ˆ๊ณ , ์•„๋‹ˆ๋ฉด ์•„๋ž˜์—์„œ ๋‚˜์˜ค๋‹ˆ๊นŒ ์ถ”ํ›„์— ์—ฌ๊ธฐ๋ฅผ ๋‹ค์‹œ ๋ณด์•„๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ €๋Š” ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ธฐ์— ์ด์ฏค์—์„œ ์งš๊ณ  ๊ฐ€๋Š”๊ฒŒ ๋งž๋‹ค๊ณ  ์ƒ๊ฐ๋˜์–ด์„œ ์—ฌ๊ธฐ์„œ ๊ธ€์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. UI ๋ฐ–์— ์œ„์น˜ํ•˜๋ฉด์„œ ์•ฑ ๋‚ด์˜ SwiftUI ๋ทฐ ๊ตฌ์กฐ์ฒด์˜ ํ•˜์œ„ ๋ทฐ์—๋งŒ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์— ObservableObject์‚ฌ์šฉ

2. UI ๋ฐ–์— ์œ„์น˜ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ๋ทฐ์—์„œ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Environment ์˜ค๋ธŒ์ ํŠธ ํ™œ์šฉ

 

View1์˜ Timer์˜ ์‹œ๊ฐ„์€ View2A - View2B์—์„œ ๊ณต์œ ํ•˜๋ฉด์„œ ๋ณด์—ฌ์ค€๋‹ค๊ณ  ํ•˜์ž.

ObservableObject์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ƒฅ ํ•˜๋ฉด๋œ๋‹ค.

๋‹ค๋งŒ EnvironmentObject๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ContentView().environment( )๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค.

 

๊ฒฐ๋ก ์€ ๊ฐœ๋ฐœ ํ”Œ๋กœ์šฐ์— ๋”ฐ๋ผ์„œ ์Šค์Šค๋กœ ์–ด๋–ค๊ฒŒ ๋” ํŽธํ• ์ง€ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

์—ฌ๊ธฐ๋ถ€ํ„ฐ๋Š” ์กฐ๊ธˆ ์œ„์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.  ์กฐ๊ธˆ ๋” ๊ฐ€๋ณ๊ฒŒ ๋ณด์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค:)

 

๐ŸŸ  PreferenceKey

๋ทฐ์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ด๋ฆ„์ด ์žˆ๋Š”(๋„ค์ž„๋“œ ๋œ)๊ฐ’ ์ž…๋‹ˆ๋‹ค.

 

 - ํ•˜๋‚˜์˜ ๋ทฐ์— ์—ฌ๋Ÿฌ ํ•˜์œ„ํ•ญ๋ชฉ(children)์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž๋™์ ์œผ๋กœ ์ƒ์œ„ ํ•ญ๋ชฉ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๊ฐ’์œผ๋กœ ๊ฒฐํ•ฉํ•œ๋‹ค.(ํ†ต์ผํ•œ๋‹ค.)

 - key - value๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค.

 - ์ „๋‹ฌ ๋ฐฉํ–ฅ์€ ํ•˜์œ„๋ทฐ -> ์ƒ์œ„๋ทฐ์ž…๋‹ˆ๋‹ค.

 

 

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด์ •๋ฆฌ - ์ด๊ฑด ๋‹ค๋ฅธ ๋ถ„์˜ ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

(์ฐธ๊ณ )

https://www.hohyeonmoon.com/blog/swiftui-data-flow/

 

SwiftUI์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„ | Hohyeon Moon

Hohyeon Moon iOS developer. Code for a happier life. Resume

www.hohyeonmoon.com

https://velog.io/@budlebee/SwiftUI-ObservableObject

 

SwiftUI : ObservableObject ์™€ EnvironmentObject

์—ฌ๋Ÿฌ View ์—์„œ ์‚ฌ์šฉ๋  State ๋ฅผ ํ•œ๋ฐ ์ €์žฅํ•ด ๋†“๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ.๋งค ์ดˆ๋งˆ๋‹ค ์ˆซ์ž๊ฐ€ 1์”ฉ ๋Š˜์–ด๋‚˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์ž. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๋‘๊ฐœ์˜ View๊ฐ€ ์žˆ๊ณ (ContentView, SecondView), ๋‘๊ฐœ์˜ View

velog.io

https://velog.io/@kipsong/SwiftUI-Preference-Key-coordinatespace

 

[SwiftUI] Preference Key & coordinatespace

Preferencekey - value ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค.์ „๋‹ฌ ๋ฐฉํ–ฅ์€ ํ•˜์œ„๋ทฐ -> ์ƒ์œ„๋ทฐ ์ž…๋‹ˆ๋‹ค.๊ตฌํ˜„๋ฐฉ๋ฒ•reduce ๋ฉ”์†Œ๋“œ ์šฐ๋ฆฌ๊ฐ€ ์„ ์–ธํ•œ “PreferenceKey” ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•˜์œ„๋ทฐ๋ฅผ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์—, ์ƒ์œ„๋ทฐ

velog.io

https://protocorn93.github.io/tags/PreferenceKey/

 

Best Website Builder Online | Yoursite

Start Your Site & Connect With The World. Create your website and go online now! All plans include custom mailboxes and web hosting.

yoursite.com

 

'apple > ๐Ÿš SwiftUI & Combine' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Combine] Let's study Combine! (feat. SwiftUI)  (0) 2022.06.03
[SwiftUI] @StateObject  (0) 2022.06.02
[iOS] ํ™”๋ฉด ์Šคํฌ๋ฆฐ์ƒท ๋ฐ ๋…นํ™” ๊ฐ์ง€ (feat. SwiftUI)  (0) 2022.06.02
[SwiftUI] ViewModifier  (0) 2022.06.02
[SwiftUI] lazyVGrid  (0) 2022.05.25
Comments