프로젝트를 진행하던 도중에 SwiftData를 사용하여 데이터를 영구 저장할 수 있는 기능을 추가하려다 아래와 같은 상황을 마주하게 되었습니다.

 

분명 문제되는 부분은 없어 보이는데 왜 안되는지 구글링을 계속 하였지만 해결되지 않았습니다..

 

시도한것

  • Apple의 데모 버전을 따라하기
  • @Main 에서 modelContainer를 initialize해보기
  • @Preview를 담아내는 뷰를 @MainActor로 지정하여 메인 스레드에서 동작하도록 만들기

하지만 문제는 엄청 간단한 곳에서 해결되었습니다.

@main
struct SmartMovieApp: App {
    
    @State private var popularmovie = MoviePopularModel()
    @State private var detailemovie = MovieDetailModel()
    @State private var searchmovie = MovieSearchModel()
    @State private var favoriteMovie = FavoriteMovie() // 바로 여기

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(popularmovie)
                .environment(detailemovie)
                .environmentObject(searchmovie)
        }
        .modelContainer(for: FavoriteMovie.self)
    }
}

 

@Model 클래스인 FavoriteMovie init의 기본값을 설정에서 뺐더니 문제점이 수면위로 떠올랐습니다.

 

애초에 @Model 클래스를 State로 받는 것이 아닌데 @State 프로퍼티 래퍼를 붙여서 만들었기 때문에 문제가 발생하였습니다.

 

해당 코드를 지우고 나니 에러가 해결되었습니다.

import SwiftUI
import SwiftData

@main
struct SmartMovieApp: App {
    
    @State private var popularmovie = MoviePopularModel()
    @State private var detailemovie = MovieDetailModel()
    @State private var searchmovie = MovieSearchModel()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(popularmovie)
                .environment(detailemovie)
                .environmentObject(searchmovie)
        }
        .modelContainer(for: FavoriteMovie.self)
    }
}

 

 

복잡한 문제라고 생각하지만 실제로는 사소한 문제일 수도 있다는 것을 알게되었습니다.

ytw_developer