SwiftData @Query 실전 함정 두 가지 — enum #Predicate와 빈 목록의 modelContext

문제 상황 문서 스캔 앱을 만들면서 Inbox/Archive 목록을 구현하고 있었는데요. SwiftData @Query로 문서 상태별 필터링을 하려던 순간, 예상치 못한 컴파일 에러 두 개를 연달아 만났습니다. 함정 1: #Predicate에서 enum 비교가 안 된다 처음 시도한 코드 자연스럽게 이렇게 작성했거든요. @Model class Document { var status: DocumentStatus // enum 저장 프로퍼티 // ... } enum DocumentStatus: String, Codable { case inbox, archived } 그리고 @Query에서 필터링: @Query( filter: #Predicate<Document> { $0.status == .inbox }, sort: \Document.createdAt, order: .reverse ) private var documents: [Document] 깔끔해 보이죠? 그런데 빌드하면 컴파일 에러가 나요. ...

2026년 4월 26일 · 2 분 · Young

SwiftData 모델명 Tag가 빌드를 깨뜨리는 이유 (+ Xcode 16 .gitkeep 함정)

뭘 하려고 했냐면 문서 스캔 앱을 새로 시작했는데요. SwiftData로 Document와 Tag 모델을 만들고, 테스트를 먼저 작성하는 TDD로 진행하고 있었어요. 모델 코드는 심플했거든요: @Model class Tag { var name: String var color: String @Relationship(inverse: \Document.tags) var documents: [Document] } 여기까지는 문제없었어요. 빌드도 잘 되고. 첫 번째 삽질: Tag가 내 Tag가 아닌데요 테스트에서 FetchDescriptor를 쓰는 순간 터졌어요: let fetched = try context.fetch(FetchDescriptor<Tag>()) error: 'Tag' is ambiguous for type lookup in this context 처음엔 뭔 소린가 했는데요. SwiftUI에 이미 Tag라는 타입이 있더라고요. TabView나 Picker에서 선택 항목을 식별할 때 쓰는 그 Tag요. ...

2026년 4월 26일 · 3 분 · Young

SwiftData + CloudKit 위젯이 데이터를 못 읽는 이유와 해결법

위젯을 달았는데 데이터가 비어 있다 JournalMind는 SwiftData + CloudKit으로 일기 데이터를 iCloud에 동기화하는 앱이에요. 홈 화면 위젯에 오늘 기분과 주간 그래프를 보여주려고 했는데, 위젯을 추가하면 항상 빈 화면만 나오더라고요. 앱 안에서는 데이터가 잘 보이는데, 위젯에서만 안 보이는 거예요. 원인: 위젯은 별도 프로세스 WidgetKit extension은 메인 앱과 별도 프로세스로 실행돼요. 같은 SwiftData ModelContainer를 만들어도, CloudKit 동기화는 메인 앱 프로세스에서만 일어나거든요. 위젯 프로세스에서 SwiftData를 열면 로컬 SQLite 파일은 읽을 수 있어요. 하지만 두 가지 문제가 있었어요: ...

2026년 4월 21일 · 3 분 · Young