λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/WWDC

[iOS] WWDC23: Discover Observation in SwiftUI / iOS17+

by Danna 2023. 10. 14.
728x90
728x90

Discover Observation in SwiftUI - WWDC23

https://developer.apple.com/videos/play/wwdc2023/10149/
https://developer.apple.com/documentation/observation

Observation 을 μ‚¬μš©ν•˜λ©΄ ν‘œμ€€ Swift ꡬ문을 μ‚¬μš©ν•΄μ„œ λͺ¨λΈμ„ μ •μ˜ν•˜κ³ , UI κ°€ λͺ¨λΈμ˜ 변경사항에 μ‘λ‹΅ν•˜λ„λ‘ ν•  수 μžˆλ‹€.
SwiftUI λ₯Ό μ‚¬μš©ν•΄μ„œ μ›ν™œν•˜κ³  μ§κ΄€μ μœΌλ‘œ κ°œλ°œν•  수 μžˆλ‹€!

λͺ©μ°¨

1:03 - What is Observation?
4:23 - SwiftUI property wrappers
7:34 - Advanced uses
10:27 - ObservableObject

What is Observation?

Observation 은 property 의 λ³€κ²½ 사항을 μΆ”μ ν•˜κΈ° μœ„ν•œ Swift 의 μƒˆλ‘œμš΄ κΈ°λŠ₯이닀.

  • Swift 5.9 의 μƒˆλ‘œμš΄ 맀크둜 μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•œλ‹€. (magic of macros!)

기쑴에 μ‘΄μž¬ν•˜λ˜ 데이터 λͺ¨λΈ ν΄λž˜μŠ€μ— @Observable ν”„λ‘œνΌν‹° 래퍼λ₯Ό μΆ”κ°€ν•˜λ©΄ UI κ°€ λͺ¨λΈμ˜ λ³€κ²½ 사항에 μ‘λ‹΅ν•˜λ„λ‘ λ§Œλ“€ 수 μžˆλ‹€.

  • @Observable μ€ Swift μ»΄νŒŒμΌλŸ¬μ—κ²Œ μž‘μ„±ν•œ μ½”λ“œλ₯Ό type 을 κ΄€μ°° ν•  수 μžˆλŠ” ν™•μž₯된 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λ„λ‘ μ§€μ‹œν•œλ‹€.

Observable type 으둜 μž‘λ™ν•˜λŠ”λ° λ‹€λ₯Έ μ’…λ₯˜μ˜ ν”„λ‘œνΌν‹° λž˜νΌλŠ” ν•„μš”ν•˜μ§€ μ•Šλ‹€ !

  • κΈ°μ‘΄μ—λŠ” SwiftUI View μ—μ„œ λ³€κ²½λ˜λŠ”κ±Έ κ°μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ” 각 λͺ¨λΈμ˜ 속성에도 @Published λ₯Ό λΆ™μ—¬μ•Ό ν–ˆκ³ ,
  • 데이터 λͺ¨λΈμ—λ„ StateObject, EnvironmentObject λ“±μ˜ ν”„λ‘œνΌν‹° 래퍼λ₯Ό λΆ™μ˜€μ–΄μ•Ό ν–ˆλ‹€.

SwiftUI λŠ” body μ½”λ“œλ₯Ό μˆ˜ν–‰ν•  λ•Œ λͺ¨λΈμ΄ νŠΉμ • 속성에 μ•‘μ„ΈμŠ€ ν•œλ‹€λŠ” 것을 μ•Œκ³  있고, μœ„μ˜ μ½”λ“œλ§ŒμœΌλ‘œ donuts μ†μ„±μ— μ•‘μ„ΈμŠ€ν•œκ²ƒμ„ 감지할 수 μžˆλ‹€.

  • body 의 μ½”λ“œκ°€ μˆ˜ν–‰λ  λ•Œ, SwiftUI λŠ” Observable νƒ€μž…μ—μ„œ μ‚¬μš©λ˜λŠ” 속성에 λŒ€ν•œ λͺ¨λ“  μ•‘μ„ΈμŠ€λ₯Ό μΆ”μ ν•œλ‹€.
  • κ·Έ 이후 μΆ”μ ν•œ 정보λ₯Ό ν†΅ν•΄μ„œ μΈμŠ€ν„΄μŠ€μ˜ 속성에 λŒ€ν•œ 변경사항이 반영될 μ‹œκΈ°λ₯Ό κ²°μ •ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.

μœ„ μ½”λ“œμ—μ„œλŠ” Add new donut λ²„νŠΌμ„ ν΄λ¦­ν•΄μ„œ donuts λ°°μ—΄μ„ λ³€κ²½ν•˜λ©΄ DonutMenu λ·°κ°€ λ¬΄νš¨ν™”λ˜κ³  UI κ°€ μ—…λ°μ΄νŠΈλ˜κ²Œ λœλ‹€.

  • ν•΄λ‹Ή λ·°μ—μ„œλŠ” orders μ†μ„±μ— λŒ€ν•œ 접근이 μ—†κΈ° λ•Œλ¬Έμ—, ν•΄λ‹Ή 값이 λ°”λ€Œκ²Œ λ˜μ–΄λ„ λ·°λŠ” μ—…λ°μ΄νŠΈ λ˜μ§€ μ•ŠλŠ”λ‹€.

Computed property λ₯Ό μΆ”κ°€ν•˜λ©΄ 이전과 λ™μΌν•œ κ·œμΉ™μ„ λ”°λΌμ„œ μ‚¬μš©λ˜λŠ” 속성이 λ³€κ²½λ˜λ©΄ UI κ°€ μ—…λ°μ΄νŠΈλœλ‹€.

  • orders κ°€ λ³€κ²½λ˜λ©΄ orderCount λ„ λ³€κ²½λ˜κ³ , Text 도 μ—…λ°μ΄νŠΈλœλ‹€.

세쀄 μš”μ•½

  • Macro
    • @Observable λ§€ν¬λ‘œλ₯Ό μ‚¬μš©ν•˜λ©΄ 관찰이 κ°€λŠ₯ν•œ μœ ν˜•μ΄ λœλ‹€.
  • Track access
    • SwiftUI λŠ” 속성에 λŒ€ν•œ 접근을 μΆ”μ ν•˜κ³ , Observation μ—μ„œ λ³€κ²½λ˜λŠ” μ‹œκΈ°λ₯Ό κ΄€μ°°ν•  수 μžˆλ‹€.
  • Property changes cause UI updates
    • 좔적 정보λ₯Ό 톡해 접근이 μžˆλŠ” 속성이 변경될 λ•Œλ§Œ View λ₯Ό λ‹€μ‹œ 그리게 λœλ‹€.

Swift Macro 에 λŒ€ν•΄μ„œ 더 μ•Œμ•„λ³΄κΈ° μ„Έμ…˜
https://developer.apple.com/videos/play/wwdc2023/10166
https://developer.apple.com/videos/play/wwdc2023/10167

SwiftUI property wrappers

Observable μ„ μ‚¬μš©ν•˜λ©΄ SwiftUI μ—μ„œ μ‚¬μš©ν•œ property wrapper μ‚¬μš©μ΄ μ‰¬μ›Œμ§„λ‹€.

  • 기쑴에 μ‚¬μš©ν•˜λ˜ state, environment, bindable 은 μ–Έμ œ μ–΄λ–»κ²Œ μ‚¬μš©λ κΉŒ 🧐

@State

@State μ†μ„±μ€ λ·°κ°€ λͺ¨λΈμ— μ €μž₯된 자체 μƒνƒœλ₯Ό κ°€μ Έμ•Ό ν•˜λŠ” κ²½μš°μ— μ‚¬μš©λœλ‹€.

  • donutToAdd state λ³€μˆ˜λŠ” sheet λ©”μ†Œλ“œλ₯Ό 톡해 λ°”μΈλ”©λ˜μ–΄ λͺ¨λ‹¬ λ·°λ₯Ό λ„μš°κ³ , 닫을 λ•Œ μ‚¬μš©ν•œλ‹€.
  • μ΄λ ‡κ²Œ νŠΉμ • 뷰의 생λͺ…주기에 따라 관리될 κ²½μš°μ—λŠ” @State property wrapper λ₯Ό μ‚¬μš©ν•œλ‹€.

@Environment

@Environment μ†μ„±μ„ ν†΅ν•΄μ„œ μ „μ—­μ μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯ν•œ κ°’μœΌλ‘œ μ „νŒŒν•  수 μžˆλ‹€.

  • Observable type 은 접근을 μΆ”μ ν•΄μ„œ μ—…λ°μ΄νŠΈλ₯Ό ν•˜κΈ° λ•Œλ¬Έμ—, userName μ΄ 변경될 λ•Œ FoodTruckMenuView κ°€ λ³€κ²½λœλ‹€.

@Bindable

https://developer.apple.com/documentation/swiftui/bindable

Binding 보닀 μ’€ 더 κ°€λ³κ²Œ λ“±μž₯ν•œ Bindable ν”„λ‘œνΌν‹° 래퍼

  • Observable type 에 λŒ€ν•΄μ„œ 바인딩을 κ°€λŠ₯ν•˜λ„λ‘ ν•΄μ€€λ‹€.
  • $ κ΅¬λ¬Έμ„ μ‚¬μš©ν•΄μ„œ ν•΄λ‹Ή 속성에 λŒ€ν•œ 바인딩을 κ°€μ Έμ˜¨λ‹€.

μœ„μ˜ μ˜ˆμ œμ—μ„œ 이름을 ν…μŠ€νŠΈν•„λ“œλ₯Ό 톡해 λ³€κ²½ν•˜κ³  μ‹Άλ‹€λ©΄

  • Text λ₯Ό TextField 둜 λ³€κ²½ν•˜κ³  $ κ΅¬λ¬Έμ„ μ‚¬μš©ν•΄μ„œ name 에 λŒ€ν•œ 바인딩을 μ „λ‹¬ν•œλ‹€.
  • 도넛에 λ°”μΈλ”©ν•˜λ €λ©΄ @Bindable var donut μœΌλ‘œ λ³€κ²½ν•˜λ©΄ λœλ‹€.

Observable type 을 State, Environment, Bindable 둜 섀정할지에 λŒ€ν•œ κΈ°μ€€

Advanced uses

μœ„μ˜ μ˜ˆμ œλ“€μ—μ„œ Observable type 은 μ €μž₯된 μƒνƒœμ˜ λͺ¨λΈμ—μ„œλ§Œ μ‚¬μš©λ˜μ—ˆμ§€λ§Œ, 더 λ§Žμ€ 일듀을 ν•  수 μžˆλ‹€.

  • SwiftUI λŠ” μΈμŠ€ν„΄μŠ€μ˜ ν•„λ“œμ— λŒ€ν•œ μ•‘μ„ΈμŠ€λ₯Ό μΆ”μ ν•˜κΈ°μ—, λ°°μ—΄, μ˜΅μ…˜, observable model 을 ν¬ν•¨ν•œ λͺ¨λ“  νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ•„λž˜ μ˜ˆμ œμ—μ„œ Observable type 인 Donut 을 λ°°μ—΄ ν˜•νƒœλ‘œ 선언해도, ν•„μš”ν•œ κ²½μš°μ— UI κ°€ μžλ™μ—…λ°μ΄νŠΈλœλ‹€.

computed property 에 ν¬ν•¨λœ 속성이 Observable type 이 μ•„λ‹Œ 경우 Observation κ³Ό ν•¨κ»˜ μž‘λ™ν•˜λ €λ©΄ 두가지 단계λ₯Ό μΆ”κ°€λ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.

  • 속성에 μ•‘μ„ΈμŠ€ ν•  λ•Œ, 속성이 변경될 λ•Œ Observation μ— μ•Œλ¦¬κΈ°λ§Œ ν•˜λ©΄λœλ‹€.

ObservableObject

μ΄μ „μ˜ 방식인 ObservableObject λ₯Ό Observable λ§€ν¬λ‘œλ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½ν•˜λŠ” 방법

  • ObservableObject 채택을 μ œκ±°ν•œλ‹€.
  • 각 속성에 μ„€μ •λœ @Published λ₯Ό μ œκ±°ν•œλ‹€.
  • Observable λ§€ν¬λ‘œλ₯Ό ν‘œμ‹œν•œλ‹€.

View μ—μ„œ 속성에 μ„€μ •ν–ˆλ˜ @ObservedObject, @EnvironmentObject` λ“±μ˜ ν”„λ‘œνΌν‹° 래퍼

  • @ObservedObject λŠ” 제거되고, ν•„μš”ν•œ 경우 @Bindable μ„ ν™œμš©ν•œλ‹€.
  • @EnvironmentObject λž˜νΌλŠ” @Environment λ‘œ λ³€κ²½λ˜μ—ˆλ‹€.

λΆˆν•„μš”ν•œ 주석이 사라지고, 세가지 @State, @Environment @Bindable property wrapper 만 λ‚¨μ•„μ„œ 더 μž‘μ„±ν•˜κΈ° μ‰¬μ›Œμ‘Œλ‹€.

  • 기쑴의 ObservableObject 에 λΉ„ν•΄ Observable λ§€ν¬λ‘œλŠ” λͺ¨λΈ λ‹¨μˆœν™”, μ„±λŠ₯ ν–₯상 κ°€λŠ₯ν•˜λ‹€ !
  • 아직은 ν—·κ°ˆλ €μš” πŸ˜‡

 

728x90
728x90