CoreData

[CoreData] 인스턴스 변수로 predicate 설정하는 방법

_히처리_ 2023. 8. 23. 11:41

Swift는 인스턴스 변수가 다 초기화되지 않으면 인스턴스 변수를 사용할 수 없다.

 

예를 들어, 다음과 같이 groupName 인스턴스 변수를 이용해서 predicate를 만들게 되면 에러가 발생한다.

struct ItemListView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @State private var isShowingNewItemSheet = false
    
    @FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \Item.name, ascending: true)],
    predicate: NSPredicate(format: "itemGroup.name == %@", groupName),
    animation: .default)
    private var items: FetchedResults<Item>
    
    let groupName: String

 

따라서 인스턴스 변수로 predicate를 만들려면 이니셜라이저에서 처리해야 한다.

struct ItemListView: View {
    @FetchRequest private var items: FetchedResults<Item>
    
    let groupName: String
    
    init(groupName: String) {
        self.groupName = groupName
        _items = FetchRequest<Item>(
            sortDescriptors: [NSSortDescriptor(keyPath: \Item.name, ascending: true)],
            predicate: NSPredicate(format: "itemGroup.name == %@", groupName)
        )
    }