失败的 NSManagedObject 仍在保存

Failing NSManagedObject still being saved

在我的自定义 NSManagedObject 中,我使用了一个可失败的初始化器。但即使它失败并且我保存了 NSManagedObjectContext,该对象也被保存到核心数据中。

NSManagedObject:

class Foo: NSManagedObject {

    @NSManaged var a: String
    @NSManaged var b: String

    convenience init?(context: NSManagedObjectContext, a: String?, b: String?) {
        let description = NSEntityDescription.entity(forEntityName: "Foo", in: context)!
        self.init(entity: description, insertInto: context)

        if let a = a { self.a = a } else { return nil }
        if let b = b { self.b = b } else { return nil }
    }
}

我怎样才能使这个初始化程序失败并仍然保存上下文而不保存失败的对象?

你需要尽快失败

convenience init?(context: NSManagedObjectContext, a: String?, b: String?) {
    if a == nil {return nil}
    if b == nil {return nil}
    // ...
}

这是合法的,因为在现代 Swift 中允许在完成初始化器的 "contract" 之前失败。