본문 바로가기

Swift

Core Data의 Bool? 이거는 왜 안되나?

import Foundation
import CoreData
import UIKit


extension FeedEntity {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<FeedEntity> {
        return NSFetchRequest<FeedEntity>(entityName: "FeedEntity")
    }

    @NSManaged public var uuid: UUID?
    @NSManaged public var imagePaths: String?
    @NSManaged public var tripLog: String?
    @NSManaged public var location: String?
    @NSManaged public var date: Date?
    @NSManaged public var category: String?
    @NSManaged public var feedID: String?
    
    // Optional이 아닌 Bool로 수정
    @NSManaged public var favorite: Bool
}

extension FeedEntity : Identifiable {

}

 

 

문제의 원인

  1. Bool? (Optional Bool)
    Core Data는 Objective-C와 호환되도록 설계되었습니다. Objective-C에는 Bool? (Optional Bool)이라는 개념이 없기 때문에, Core Data는 Optional을 직접 저장할 수 없습니다.
    • @NSManaged 프로퍼티는 Objective-C와의 호환성을 유지해야 하므로, Bool?은 허용되지 않습니다.
  2. Bool (Non-Optional Bool)
    반면, Bool은 Core Data의 기본 저장 가능 타입으로 인식됩니다. Objective-C에서 bool로 표현되며, Core Data에서 이를 저장하고 관리할 수 있습니다. 따라서 Bool 타입만 @NSManaged로 사용할 수 있는 것이죠.

해결이 된 이유

Bool?에서 ?를 제거하면 Swift의 Optional이 사라지고 Core Data가 이를 정상적으로 처리할 수 있게 됩니다. Core Data는 내부적으로 Bool을 NSNumber로 변환해 저장하며, Swift에서는 이를 직관적으로 사용할 수 있습니다.