[Swift] Cannot convert value of type 'ModelData' to expected argument type 'EnvironmentObject<ModelData>'

    ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋ฌธ๋“ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. envirionmentObject๋„ ๊ทธ๋ƒฅ property์ฒ˜๋Ÿผ ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?? 

    struct LandmarkList_Previews: PreviewProvider {
        static var previews: some View {
            LandmarkList()
                .environmentObject(ModelData())
        }
    }

    ๊ทธ๋ž˜์„œ ์—๋Ÿฌ๋ฅผ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค. 


    LandmarkList_Previews์—์„œ LandmarkList(modelData: ModelData)๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” @EnvironmentObject ์†์„ฑ์€ ํ™˜๊ฒฝ(environment)์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ(property) ๋ž˜ํผ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹ ์— .environmentObject๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ํ™˜๊ฒฝ์— ์ฃผ์ž…ํ•ด์•ผ ํ•œ๋‹ค.

     


    ๊ทธ๋Ÿผ ์ผ๋ฐ˜ ํ”„๋กœํผํ‹ฐ์™€์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ! 

     

    ์ผ๋ฐ˜ ํ”„๋กœํผํ‹ฐ์™€ @EnvironmentObject ์†์„ฑ์˜ ์ฐจ์ด์ ์€ ์ฃผ์ž…๋˜๋Š” ๊ฐ์ฒด์˜ ์ˆ˜๋ช…๊ณผ ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌ ๋ฐฉ์‹์ด๋‹ค.

    ๊ฐ์ฒด์˜ ์ˆ˜๋ช…
    ์ผ๋ฐ˜ ํ”„๋กœํผํ‹ฐ: ์ผ๋ฐ˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋Š” ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์˜ ์ผ๋ถ€๋กœ ์œ ์ง€๋œ๋‹ค. ์ด๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๊ฐ์ฒด๊ฐ€ ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    @EnvironmentObject ์†์„ฑ: @EnvironmentObject ์†์„ฑ์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋Š” ํ™˜๊ฒฝ(environment)์— ์ €์žฅ๋œ๋‹ค. ํ™˜๊ฒฝ์€ SwiftUI์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ „์—ญ์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋Š” ํ™˜๊ฒฝ์— ์ €์žฅ๋˜์–ด ์•ฑ ์ „๋ฐ˜์—์„œ ๊ณต์œ ๋˜๋ฉฐ, ๋ทฐ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ์—ฌ๋Ÿฌ ๋ทฐ์—์„œ ๋™์ผํ•œ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.


    ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌ
    ์ผ๋ฐ˜ ํ”„๋กœํผํ‹ฐ: ์ผ๋ฐ˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ ๊ฐ์ฒด๋Š” ๋ทฐ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ทฐ์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    @EnvironmentObject ์†์„ฑ: @EnvironmentObject ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ž๋™์œผ๋กœ ๋ทฐ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด SwiftUI๋Š” ํ™˜๊ฒฝ์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ทฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ๋”ฐ๋ผ์„œ @EnvironmentObject ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ๋ฐ˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด @EnvironmentObject์™€ @State, @Binding์˜ ์ฐจ์ด๋Š” ? 

     

    EnvironmentObject, State, ๊ทธ๋ฆฌ๊ณ  Binding์€ SwiftUI์—์„œ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์„ธ ๊ฐ€์ง€ ์†์„ฑ์ด๋‹ค.

    @EnvironmentObject
    - ๊ฐœ์š”: EnvironmentObject๋Š” ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋Š” ํ™˜๊ฒฝ(environment)์— ์ €์žฅ๋˜์–ด ์•ฑ ์ „์ฒด์—์„œ ๊ณต์œ ๋œ๋‹ค.
    - ์ƒํƒœ ๊ณต์œ : EnvironmentObject๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ํ™˜๊ฒฝ์— ์ฃผ์ž…ํ•˜์—ฌ ๋ชจ๋“  ํ•˜์œ„ ๋ทฐ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    - ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌ: ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ทฐ๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

    @State
    - ๊ฐœ์š”: @State๋Š” ๋ทฐ ๋‚ด์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋กœ์ปฌํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ์ด๋‹ค. ํ•ด๋‹น ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค SwiftUI๋Š” ๋ทฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•œ๋‹ค.
    - ์ƒํƒœ ๊ณต์œ : @State๋Š” ๋ทฐ ๋‚ด์—์„œ ๋กœ์ปฌํ•œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์ƒํƒœ๋Š” ๋ทฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํƒœ๋ฅผ ๋‹ค๋ฅธ ๋ทฐ์™€ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Binding์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    - ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌ: @State๋Š” ์ž์ฒด์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๋ทฐ์™€ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๋ ค๋ฉด `Binding`์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

    @Binding
    - ๊ฐœ์š”: Binding์€ ๊ฐ’์„ ๋ž˜ํ•‘ํ•˜๊ณ  ํ•ด๋‹น ๊ฐ’์„ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ์ด๋‹ค. Binding์€ ๊ฐ’์˜ ์ฐธ์กฐ๋ฅผ ๋ณด์œ ํ•˜๋ฉฐ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ•ด๋‹น ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    - ์ƒํƒœ ๊ณต์œ : Binding์€ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์ƒ์œ„ ๋ทฐ์—์„œ @State๋ฅผ ์„ ์–ธํ•˜๊ณ  Binding์œผ๋กœ ํ•˜์œ„ ๋ทฐ์— ์ „๋‹ฌํ•˜์—ฌ ํ•˜์œ„ ๋ทฐ์—์„œ๋„ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    - ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌ: Binding์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜์—ฌ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

     


    ์ฐจ์ด์ 
    - ๋ฒ”์œ„: EnvironmentObject๋Š” ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , State๋Š” ๋ทฐ ๋‚ด์—์„œ ๋กœ์ปฌํ•œ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Binding์€ ์ƒ์œ„ ๋ทฐ์—์„œ ํ•˜์œ„ ๋ทฐ๋กœ ๊ฐ’์˜ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    - ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌ: EnvironmentObject๋Š” ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ SwiftUI๊ฐ€ ์ž๋™์œผ๋กœ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. State๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋ทฐ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค. Binding์€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜์—ฌ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    - ์ƒํƒœ ๊ณต์œ : EnvironmentObject๋Š” ๊ฐ์ฒด๋ฅผ ํ™˜๊ฒฝ์— ์ฃผ์ž…ํ•˜์—ฌ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ํ•œ๋‹ค. State๋Š” ๋ทฐ ๋‚ด์—์„œ ๋กœ์ปฌํ•œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , Binding์€ ์ƒ์œ„ ๋ทฐ์—์„œ ํ•˜์œ„ ๋ทฐ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€