[SwiftUI] Property Wrapper ์ด์ •๋ฆฌ

2024. 7. 26. 15:28ยท๐ŸŽ Dev/SwiftUI

 

PropertyWrapper

 

์ •์˜

  • Swift 5.1 ๋ฒ„์ „๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ฌธ๋ฒ•
  • ์ •์˜๋œ property๊ฐ€ ์žˆ์„ ๋•Œ ํ•ด๋‹น property๋ฅผ ๊ฐ์‹ธ์„œ ํŠน๋ณ„ํ•œ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค
  • ํ”„๋กœํผํ‹ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ทธ ๊ฒฝ๊ณ„๋ฅผ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ์—ญํ• 
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„์˜ ์ฝ”๋”ฉ ์—†์ด ์–ด๋…ธํ…Œ์ด์…˜๋งŒ ์„ ์–ธํ•ด๋„ ๋ทฐ์—์„œ ์ˆ˜์ •์ด๋‚˜ ์ฝ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์บก์Аํ™”๋ฅผ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ์—ญํ• 

์‚ฌ์šฉ์ด์œ 

  • ํ”„๋กœํผํ‹ฐ์˜ ์ ‘๊ทผ์„ ํŠน์ • ๋กœ์ง์„ ํ†ตํ•ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ. —> ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ธ์Šคํ„ด์Šค๋กœ ๋นผ๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ.
  • ํŠน์ • ํ–‰๋™์„ ์ •์˜ํ•˜๋Š” ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๊ฒƒ. ํŠนํžˆ, ๊ฐ™์€ get-set์„ ํ™œ์šฉํ•˜๋Š” ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์„ ์žฌ์‚ฌ์šฉ ํ•ด์•ผํ•  ๋•Œ PropertyWrapper๋กœ ์ •์˜ํ•˜๊ณ  ํ•ด๋‹น ๋กœ์ง ์ž๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ.

๋งŒ๋“œ๋Š” ๋ฐฉ์‹: @propertyWrapper ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐ์ฒด ๋งŒ๋“ฌ

  • ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ (get, set), ์ €์žฅ ํ”„๋กœํผํ‹ฐ (didSet) ๋“ฑ์„ property wrapper๋กœ ๋งŒ๋“ค์–ด ์“ธ ์ˆ˜ ์žˆ์Œ
  • ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๋Š” ํƒ€์ž… ์•ž์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉ (e.g. Class, Struct, Enum)

ProjectedValue

  • ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋กœ ์ƒํƒœ๊ฐ’์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ (ํŠน์ • ์ƒํƒœ์˜ ๋ณ€ํ™”๋ฅผ ๋‹ค๋ฃฐ๋•Œ ์‚ฌ์šฉ)
  • projectedValue๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋Š” $๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉ → @State ๊ฐ™์€ ๋ž˜ํผ ์‚ฌ์šฉ ์‹œ $์„ ๋ถ™์—ฌ์ฃผ๋Š” ๊ทผ๋ณธ์  ์ด์œ !
  • wrappedValue๋Š” wrapping๋œ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๊ฐ’์— ์ ‘๊ทผ, projectedValue๋Š” propertyWrapper ๋‚ด๋ถ€์—์„œ ์ •์˜ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ —> ์ฆ‰, ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ์ถ”๊ฐ€๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.

 

 

References

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/#Property-Wrappers

 

Documentation

 

docs.swift.org

 

https://ios-development.tistory.com/895

 

[iOS - swift] @propertyWrapper์˜ projectedValue ๊ฐœ๋… ($ ์ ‘๋‘์‚ฌ, ๋‹ฌ๋Ÿฌ ์ ‘๋‘์‚ฌ)

PropertyWrapper ์ด๋ฏธ ์ •์˜๋œ property๊ฐ€ ์žˆ์„ ๋•Œ, ์ด property๋ฅผ ๊ฐ์‹ธ์„œ(wrapping) computed-property๋กœ ๋งŒ๋“  ์ƒˆ๋กœ์šด wrapper ํ”„๋กœํผํ‹ฐ๋ฅผ ์˜๋ฏธ propertyWrapper ํ”„๋กœํผํ‹ฐ ์•ˆ์—๋Š” wrappedValue๋ผ๋Š” property๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด proper

ios-development.tistory.com

 

 

 

 


 

 

@State

SwiftUI์—์„œ ๊ฐ’์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” propertyWrapper (๊ฐ’ ์œ ํ˜•์˜ ์†์„ฑ์— ๋Œ€ํ•œ ์ €์žฅ)

  • ์ฆ‰, ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์“ธ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•จ.
  • ๊ฐ’์˜ ๋ณ€ํ˜•์„ ๊ฐ์ง€ํ•˜๊ณ  ํ•ด๋‹น ๊ฐ’์— ์˜์กดํ•˜๋Š” ๋ทฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋จ.
  • ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค body ์†์„ฑ์ด ์žฌ์„ค์ • ๋˜๊ธฐ ๋•Œ๋ฌธ. —> ํ•ญ์ƒ ์ตœ์‹ ๊ฐ’ ์œ ์ง€

์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ ?

  • UI์˜ ์ƒํƒœ๊ฐ’๊ณผ ๊ฐ™์€ ํ•œ์ •๋œ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ๊ณ  → ๋ทฐ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๊ธฐ ๋•Œ๋ฌธ. ๋ทฐ ๋ฐ–์˜ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ObservableObject๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

์™œ private ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ @State์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ• ๊นŒ?

  • @State ํ”„๋กœํผํ‹ฐ๋Š” ํ•ญ์ƒ private์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ๊ฐ€์žฅ ์ƒ์œ„ ๋ทฐ์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•ด๋‹น ๋ทฐ๊ฐ€ Data๋ฅผ ์†Œ์œ ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ๊ฐœ๋…์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ์„ ์–ธํ•œ ๋ทฐ ์™ธ์—์„  ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— @State ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ ค๋ฉด ๊ฐ€์žฅ ์ƒ์œ„๋ทฐ์— private ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ๋ถ™์—ฌ์„œ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์— ์„ค์ •ํ•˜๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•œ๋‹ค. (๋ทฐ ๋‚ด๋ถ€ ๋ฐ–์—์„  ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ!)
  • ๋ทฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ• ๋•Œ, @State ํ”„๋กœํผํ‹ฐ ๊ฐ’๋„ ๊ฐ™์ด ์ดˆ๊ธฐํ™”ํ•˜๊ฒŒ๋˜๋ฉด SwiftUI์—์„œ @State ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์ธ Storage์—์„œ conflict๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ

 

 

References

 

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

 

State | Apple Developer Documentation

A property wrapper type that can read and write a value managed by SwiftUI.

developer.apple.com

 

https://velog.io/@suhwj/SWIFTUI-STATE

 

 

SWIFTUI @STATE

UIKit ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ์–ด๋– ํ•œ ๋ณ€์ˆ˜์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ•ด๋‹น ๋ณ€ํ™”๋ฅผ ์ง์ ‘ ๊ด€์ฐฐํ•˜๊ณ  ๋ฐ˜์˜ ํ•ด ์ฃผ์–ด์•ผ ํ–ˆ๋Š”๋ฐ SwiftUI ์—์„œ๋Š” property wrapper ๋ฅผ ํ™œ์šฉํ•ด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.๋ณ€ํ™”๊ฐ€ ์ƒ

velog.io

 

 

 

 

 


 

 

 

 

@Binding

๋‘ ๊ฐœ์˜ ๋ทฐ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ (๋ฐ์ดํ„ฐ์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” wrapper!)

 

์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

  • ๋ฐ”์ธ๋”ฉ ์†์„ฑ์€ ๊ฐ’์˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ ๋ทฐ์™€ ์ž์‹ ๋ทฐ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.
    • ์ž์‹๋ทฐ → ์—…๋ฐ์ดํŠธ → ๋ถ€๋ชจ๋ทฐ ๋˜ํ•œ ์—…๋ฐ์ดํŠธ ๋˜์–ด ๋™์ผํ•œ ๊ฐ’ ์œ ์ง€. ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๊ฐ™๋‹ค.
  • ํ•œ ๋ฐ”์ธ๋”ฉ ์†์„ฑ์„ ์—ฌ๋Ÿฌ ๋ทฐ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ชจ๋“  ์—ฐ๊ฒฐ๋œ ๋ทฐ์— ๋™์‹œ์— ๋ฐ˜์˜.

 

Reference

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

 

Binding | Apple Developer Documentation

A property wrapper type that can read and write a value owned by a source of truth.

developer.apple.com

 

 

 

 

 

 

 


 

 

 

 

@StateObject

๊ด€์ฐฐ์ค‘์ธ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์— ๋ฐ˜์‘ํ•ด์„œ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” SwiftUI์˜ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ

  • @StateObject๋ฅผ ํ†ตํ•ด์„œ ๊ด€์ฐฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋Š” ๊ทธ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ™”๋ฉด ๊ตฌ์กฐ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜์–ด๋„ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜๊ธฐ ์ „์— ํผ๋ธ”๋ฆฌ์‹ฑํ•˜๋Š” ํผ๋ธ”๋ฆฌ์…”๋ฅผ ๊ฐ–๋Š”๋‹ค! ์ด ์—ญํ• ์€ ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  observableObject ๋‚ด์— ์žˆ๋Š” @Published ์†์„ฑ์˜ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ willSet ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์คŒ.
  • @State vs @StateObject
    • ์•ฑ์˜ ํŠน์ • ํ™”๋ฉด์—์„œ ์ธ์Šคํ„ด์Šคํ™” ํ•˜๊ณ  ์œ ์ง€ํ•˜๋ คํ•˜๋Š” observableObject ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. → Struct ํƒ€์ž…๋งŒ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด @State๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ.

References

 

https://developer.apple.com/documentation/swiftui/stateobject?changes=_9

 

StateObject | Apple Developer Documentation

A property wrapper type that instantiates an observable object.

developer.apple.com

 

https://pilgwon.github.io/post/state-object-vs-observed-object

 

[์ˆ˜์œ„ํ”„ํŠธUI/๋ฒˆ์—ญ] @StateObject์™€ @ObservedObject, ๋ฌด์—‡์ด ๋‹ค๋ฅผ๊นŒ์š”?

@StateObject vs. @ObservedObject: The differences explained

pilgwon.github.io

 

 

 


 

 

 

@ObservedObject

  • ์ปด๋ฐ”์ธ ์†์„ฑ
  • ๊ด€์ฐฐ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ
    • ObservableObject๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ํ•ด๋‹น ๊ฐ์ฒด์˜ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ๋ทฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” PropertyWrapper.
    • ์ฆ‰, ๋ชจ๋ธ์ด ๋ทฐ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์— ์˜์กด์ ์ด๋‹ค.

 

References

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

 

ObservedObject | Apple Developer Documentation

A property wrapper type that subscribes to an observable object and invalidates a view whenever the observable object changes.

developer.apple.com

 

https://green1229.tistory.com/228

 

Combine - ObservableObject / @Published / @ObservedObject

์•ˆ๋…•ํ•˜์„ธ์š”. ๊ทธ๋ฆฐ์ž…๋‹ˆ๋‹ค๐ŸŸข ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ObservableObject๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด ํ•™์Šตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ™‹๐Ÿป ์ถ”๊ฐ€๋กœ ์ด์–ด์ ธ์„œ @Published์™€ @ObservedObject๋„ ๋ณด์‹œ์ฃ ! ์š”์ฆ˜ ๊ฐœ์ธ์ ์œผ๋กœ ๋งŽ์ด ๋ฐ”๋น ์ ธ์„œ ๋ธ”

green1229.tistory.com

 

 

 

 

 


 

 

 

 

 

StateObeject vs. ObservedObject

  • StateObeject์™€ ObservedObject๋Š” ๊ด€์ฐฐ์ค‘์ธ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋ฐ˜์‘ํ•ด์„œ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” propertyWrapper์ด๋‚˜, ๋šœ๋ ทํ•œ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•จ.

๊ณตํ†ต์ 

  • ObservableObject๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์ด ๊ฐ์ฒด์˜ ๊ฐ’ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ๋ทฐ์— ๋ฐ˜์˜ํ•ด์ค€๋‹ค.
    • ObservableObject๋ž€โ“ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€์ฐฐํ•˜๋‹ค๊ฐ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. → Class ํ˜•ํƒœ๋กœ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฐจ์ด์ 

  • @ObservedObject ๊ฐ’ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋ทฐ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ๋ทฐ๋ฅผ ์žฌ์ƒ์„ฑ (๊ฐ’์„ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค) → ๋”ฐ๋ผ์„œ, ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋Š” subview์— ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฃผ์ž…ํ•ด์•ผํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ๊ถŒ์žฅ.
  • @StateObject ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์ ธ๋„ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ → ๋ทฐ๊ฐ€ ์žฌ์ƒ์„ฑ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ์ดˆ๊ธฐํ™” ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

 

References

https://www.avanderlee.com/swiftui/stateobject-observedobject-differences/

 

@StateObject vs. @ObservedObject: The differences explained

@StateObject and @ObservedObject have similar characteristics but differ in an important way which can lead to unexpected bugs.

www.avanderlee.com

 

 

 

 

 


 

 

 

 

 

@Published

  • ์ปด๋ฐ”์ธ ์†์„ฑ
  • ObservableObject์—์„œ ์†์„ฑ์„ ์„ ์–ธํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” PropertyWrapper.
    • $ ํ‘œ์‹œ๋ฅผ ํ†ตํ•ด ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.
    • Observable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•ด์•ผํ•œ๋‹ค.
  • @Published๋กœ ์„ ์–ธ๋œ ์†์„ฑ์€ ํ•ด๋‹น ์†์„ฑ์˜ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋ ๋•Œ๋งˆ๋‹ค ๋ทฐ๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
    • ObservableObject (ํด๋ž˜์Šค) ์™€ ์ฃผ๋กœ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉฐ, ์„ ์–ธ ์†์„ฑ์ด ๋ณ€๊ฒฝ ๋  ๋•Œ๋งˆ๋‹ค ํผ๋ธ”๋ฆฌ์…”๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋Œ€์‹ , ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ทฐ๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ทฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆผ. → @Publisehd๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ ๋ทฐ๋ฅผ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฌ์ง€ ์•Š์Œ.

 

 

References

https://clamp-coding.tistory.com/513

 

SwiftUI - @ObservableObject, @ObservedObject, @Published, ObjectWillChange

@ObservableObject @ObservedObject๋Š” ObservableObject ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๋ทฐ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. ObservableObject๋Š” Classํ˜•ํƒœ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Structํ˜•ํƒœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. class

clamp-coding.tistory.com

https://green1229.tistory.com/228

 

Combine - ObservableObject / @Published / @ObservedObject

์•ˆ๋…•ํ•˜์„ธ์š”. ๊ทธ๋ฆฐ์ž…๋‹ˆ๋‹ค๐ŸŸข ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ObservableObject๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด ํ•™์Šตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ™‹๐Ÿป ์ถ”๊ฐ€๋กœ ์ด์–ด์ ธ์„œ @Published์™€ @ObservedObject๋„ ๋ณด์‹œ์ฃ ! ์š”์ฆ˜ ๊ฐœ์ธ์ ์œผ๋กœ ๋งŽ์ด ๋ฐ”๋น ์ ธ์„œ ๋ธ”

green1229.tistory.com

 

 

https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-published-property-wrapper

 

https://developer.apple.com/documentation/combine/published

 

Published | Apple Developer Documentation

A type that publishes a property marked with an attribute.

developer.apple.com

 

 

 

 

 


 

 

 

 

 

@environmentObject

  • ์•ฑ์˜ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•จ
  • ๋ทฐ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • parent ๋˜๋Š” ancestor ๋ทฐ์—์„œ observable ๊ฐ์ฒด๋กœ ์ •์˜ํ•˜๋ฉฐ, subview์˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ propertyWrapper์ด๋‹ค.
  • ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ํ•˜์œ„ ๊ณ„์ธต์„ ๊ฑธ์น  ๋•Œ, state-binding ๊ตฌ์กฐ ๋ณด๋‹ค๋Š” environmentObject๋ฅผ ํ™œ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

 

References

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

 

EnvironmentObject | Apple Developer Documentation

A property wrapper type for an observable object that a parent or ancestor view supplies.

developer.apple.com

 

https://ios-development.tistory.com/1161

 

[iOS - SwiftUI] @EnvironmentObject ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (๋ทฐ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ  ๋ฐฉ๋ฒ•, .environmentObject())

๋ชฉ์ฐจ) SwiftUI์˜ ๊ธฐ๋ณธ - ๋ชฉ์ฐจ ๋งํฌ @EnvironmentObject ๋ž€? parent ๋ทฐ์—์„œ ์ •์˜ํ•œ observable ๊ฐ์ฒด์ด๋ฉฐ, subview๋“ค์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ๋กœ property wrapper ํƒ€์ž… ์ฆ‰, parent ๋ทฐ์—์„œ subview์— ํŠน์ • ์ƒํƒœ๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ, sub

ios-development.tistory.com

 

 

 

 

 

 


 

 

@Bindable

  • iOS 17+
  • Observable์„ ์ค€์ˆ˜ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด @Binding์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ @Bindable์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. (state, binding...๋“ฑ๋“ฑ ๋‹ค ์•ˆ๋…•~ ํ•  ์ˆ˜ ์žˆ๋‹ค.)

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

 

  • ObservableObject →@Observable

https://www.donnywals.com/whats-the-difference-between-binding-and-bindable/

 

What’s the difference between @Binding and @Bindable – Donny Wals

With iOS 17, macOS Sonoma and the other OSses from this year’s generation, Apple has made a couple of changes to how we work with data in SwiftUI. Mainly, Apple has introduced a Combine-free version…

www.donnywals.com

 

  • Apple has introduced a Combine-free version of @ObservableObject and @StateObject which takes the shape of the @Observable macro which is part of a new package called Observation.
  • On iOS 17 we have access to the @Observable macro which doesn't enable us to create bindings in the same way that the ObservableObject does. Instead, if our @Observable object is a class, we can ask our views to make that object bindable.

→ iOS 17 ๋ถ€ํ„ฐ @Observable ์ด๋ผ๋Š” ๊ฒŒ ์ƒ๊ฒผ๊ณ , ์ด ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค. ํด๋ž˜์Šค์—์„œ bindingํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ฐ€๋Šฅ์ผ€ ํ•ด์ฃผ๋Š” ๊ฒŒ bindable์ด๋‹ค.

→ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ? ๋ทฐ๊ฐ€ Observable ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์„ ๋•Œ @State๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ์ ์ ˆ์น˜ ๋ชปํ•จ. Bindable์€ ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์ค€๋‹ค.

 

 

References

 

https://eunjin3786.tistory.com/582

 

[SwiftUI] @Observable ๋งคํฌ๋กœ (2)

[SwiftUI] @Observable ๋งคํฌ๋กœ (1) ์—์„œ ์ด์–ด์ง‘๋‹ˆ๋‹ค. [ ์š”์•ฝ ] # 1. ์˜ˆ์ „์— ๋ทฐ์—์„œ ์ผ๋˜ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ @State, @Binding, @ObservedObject, @StateObject, @EnvironmentObject, @Enviroment iOS 17+ ๋ถ€ํ„ฐ๋Š” 4๊ฐœ๋งŒ ์“ฐ๋ฉด ๋จ @State, @Bindin

eunjin3786.tistory.com

 

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

 

Bindable | Apple Developer Documentation

A property wrapper type that supports creating bindings to the mutable properties of observable objects.

developer.apple.com

 

 

 

 

 

 

 


 

 

 

@Binding vs @Bindable

์ฐจ์ด์ 

  • @Binding์€ ๋ทฐ์˜ ์ผ๋ถ€ ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅธ ๋ทฐ์— ์˜ํ•ด ์†Œ์œ ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ ‘๊ทผ๊ถŒํ•œ์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • @Bindable์€ Observable ํด๋ž˜์Šค๋ฅผ ์†Œ์œ ํ•œ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. Observable์„ ์ค€์ˆ˜ํ•˜๋Š” ํด๋ž˜์Šค์—๋งŒ ์ œํ•œ๋˜๋ฉฐ, Observable ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ @Observable ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ.

๊ณตํ†ต์ 

  • ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ ๊ณต์œ  ๊ธฐ๋Šฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์Œ.

References

https://www.donnywals.com/whats-the-difference-between-binding-and-bindable/

 

What’s the difference between @Binding and @Bindable – Donny Wals

With iOS 17, macOS Sonoma and the other OSses from this year’s generation, Apple has made a couple of changes to how we work with data in SwiftUI. Mainly, Apple has introduced a Combine-free version…

www.donnywals.com

 

 

 

 

 


 

์ถ”๊ฐ€ํ•™์Šต

 

The Source Of Truth

  • ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋ทฐ๋ฅผ ๋ Œ๋”๋ง ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์ •ํ™•์„ฑ์„ ์œ ์ง€ํ•ด์•ผํ•จ.
    • ์ƒํƒœ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ณต์‚ฌ๋˜๊ณ  ์‚ฌ์šฉ๋˜๋ฉด ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์œ„ํ—˜์ด ์žˆ์Œ. (๋ฌด์—‡๋ณด๋‹ค SwiftUI์˜ UI๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์— ๋ฐ”์ธ๋”ฉ ๋˜์–ด ์žˆ์–ด์„œ ๋ณ€ํ™”๊ฐ’์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐœ๋…์„ ์ธ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ)
    • SwiftUI์˜ UI ์—…๋ฐ์ดํŠธ๋Š” ์ƒ์œ„๋ทฐ์— source of truth์ธ ๋ฐ์ดํ„ฐ๋ชจ๋ธ (e.g. @State…)์„ ๋‘๊ณ , ํ•˜์œ„๋ทฐ์—๋Š” ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹.
  • ๋”ฐ๋ผ์„œ, swiftUI์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์ „์ œ๋Š” ‘๋ทฐ๋Š” a single of source๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ  ์žˆ๋‹ค’์™€ ๊ฐ™๋‹ค.
    • SwiftUI์—์„œ State์™€ Binding์€ SSOT๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” propertyWrapper์ด๋‹ค.
      • ์™œ?! → @State๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ single source of truth๊ฐ€ ์ƒ์„ฑ ๋˜๊ธฐ ๋•Œ๋ฌธ!
    • UIKit์—์„œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋ทฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋กœ์ง ๊ตฌ์„ฑ์ด ๊นŒ๋‹ค๋กœ์› ์œผ๋‚˜, SOT๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ชจ๋ธ๊ณผ ๋ทฐ ์‚ฌ์ด์— ์˜์กด๊ด€๊ณ„๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”๋ฉด ๋ทฐ๋ฅผ ์ž๋™์œผ๋กœ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ.

 

 

Reference

 

https://medium.com/@eung7/the-source-of-truth-in-swiftui-state-observableobject-1421b8f80f54

 

The Source Of Truth in SwiftUI, State ObservableObject

SwiftUI์—์„œ UI์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ Source Of Truth์ž…๋‹ˆ๋‹ค.

medium.com

 

https://80000coding.oopy.io/0930a96d-aaa5-4831-9974-03615ae1d6b6

 

SwiftUI) Source of Truth๋ž€???

Source of Truth๋ž€???

80000coding.oopy.io

 

https://kimhaeun.com/59

 

[SwiftUI] ํ—ท๊น”๋ฆฌ๋Š” State, Binding, ObservedObject, EnvironmentObject ์ด์ •๋ฆฌ

SwiftUI์—์„œ์˜ Single Source of Truth(SSOT, ๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›)๋ž€ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์ •ํ™•์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค. ์ •๋ณด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ SSOT(Single Source Of Truth) ์•„ํ‚คํ…์ฒ˜ ๋˜๋Š” SPOT(Single Point Of Tr

kimhaeun.com

 

 

 

 

 


 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐ŸŽ Dev > SwiftUI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[SwiftUI] Navigation 1  (0) 2024.09.24
[SwiftUI] scrollTargetLayout๊ณผ ScrollTargetBehavior  (0) 2024.08.16
[SwiftUI] Frame  (0) 2024.07.22
[SwiftUI] @State  (0) 2024.05.22
[SwiftUI] NavigationView, NavigationStack, navigationTitle  (2) 2024.04.15
'๐ŸŽ Dev/SwiftUI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [SwiftUI] Navigation 1
  • [SwiftUI] scrollTargetLayout๊ณผ ScrollTargetBehavior
  • [SwiftUI] Frame
  • [SwiftUI] @State
Callie_
Callie_
  • Callie_
    CalliOS
    Callie_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • ๐ŸŽ APPLE
      • ๐ŸŽ Dev
        • Swift
        • UIKit
        • SwiftUI
        • Issue
        • ๊ตฌํ˜„
      • ๐ŸŽ Design
        • HIG
      • โš™๏ธ CS
      • ๐Ÿ’ก ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
        • ๋ฐฑ์ค€
      • ๐ŸŸ๏ธ ์ง๊ด€๋กœ๊ทธ (์ถœ์‹œ์•ฑ)
        • ์—…๋ฐ์ดํŠธ
      • ๐ŸŒฑ SeSAC iOS 3๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    stroyboard
    DidEndOnExit
    .OverFullScreen
    assets
    cornerradius
    Entry Point
    apply
    Enum
    TapGestureRecognizer
    ios
    layer.shadow
    ์ƒ๋ช…์ฃผ๊ธฐ
    addTarget
    DiffableDataSource
    IBOutlet
    .fullScreen
    clipsToBound
    ๋„คํŠธ์›Œํฌํ†ต์‹ 
    Swift
    Infoํƒญ
    diffable
    SeSAC
    CustomView
    SwiftUI
    modalPresentStyle
    TableViewCell
    IBAction
    Snapshot
    CocoaTouchFramework
    ํ™”๋ฉด์ „ํ™˜
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Callie_
[SwiftUI] Property Wrapper ์ด์ •๋ฆฌ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”