Xcode NSManagedObject 子类在它们被标记为非可选时包含可选
Posted
技术标签:
【中文标题】Xcode NSManagedObject 子类在它们被标记为非可选时包含可选【英文标题】:Xcode NSManagedObject subclass contains optionals when they are marked as non-optional 【发布时间】:2015-11-05 15:19:58 【问题描述】:我有一个名为 Film 的核心数据实体,它具有属性标题和日期。我注意到生成的 NSManagedObject 子类包含可选的 NSManaged 属性,即使我在核心数据检查器中将这些属性标记为非可选。
我可以手动将其更改为非可选属性,还是将其保留为可选属性是更好的选择?为什么?
【问题讨论】:
相关:***.com/questions/25485273/… 在 CoreData 实体属性面板中,将 Codegen 标记为 Manual 并手动声明您的 NSManagedObject 【参考方案1】:“可选”对 Core Data 的含义不同于对 Swift 的含义。
如果 Core Data 属性不是可选的,则保存更改时它必须具有非零值。在其他时候,Core Data 并不关心属性是否为 nil。 如果 Swift 属性不是可选的,则它必须在初始化完成后始终具有非零值。将 Core Data 属性设为非可选并不意味着它在 Swift 术语中是非可选的。这就是生成的代码使这些属性成为可选的原因——就 Core Data 而言,除了保存更改之外,具有 nil 值是合法的。
【讨论】:
确保您至少在override func awakeFromInsert()
中分配了任何非可选变量。
什么是使它成为非可选的解决方案。我应该创建手动文件并使其成为非可选的吗?【参考方案2】:
这是一个已知问题。有些人将其更改为非可选而没有不利影响,我保持它的生成方式并希望早日修复。
向 Apple 提交错误以提高知名度和优先级总是有帮助的。
【讨论】:
Xcode 10.1 中仍然存在。我想,对于 Apple 而言,“早期修复”最多意味着几年。 XCode 11.3.1 中仍然存在。现在是 2020 年。 Xcode 11.5 版中仍然存在。这一年是 2020 年(大流行正在发生)。 请阅读接受的答案。这不是一个错误,没有人会修复它,因为......嗯......没有什么可以fx【参考方案3】:创建 managedobject 类并将实体类类型更改为手动并将这些类添加到您的项目范围。
编辑您的 managedObject 使它们成为非可选的。这意味着您需要自己维护这个类并在核心数据模型和类中进行任何更改
如果您的数据模型稳定且不会更改,那么您可以使用它。
【讨论】:
【参考方案4】:数据模型检查器中的 Optional 复选框与 Swift 选项无关。复选框确定属性是否需要有值。
如果取消选择属性的可选复选框,则必须为该属性指定一个值,否则保存时会出错。通过选择可选复选框,您可以在不给属性值的情况下进行保存。假设您有一个描述属性,它是一个字符串。如果您选择可选复选框,您可以将描述留空并仍然保存实体。
这是另一个例子。假设您有文本字段可以让某人输入他们的家庭、工作和手机号码。这些电话号码应该是可选属性。您不会为了保存数据而要求某人拥有家庭电话号码、工作电话号码和手机号码。
【讨论】:
听起来和 Swift optionals 是一样的……我看不出区别以上是关于Xcode NSManagedObject 子类在它们被标记为非可选时包含可选的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 8.0 NSManagedObject 子类模板在哪里
Xcode 和核心数据 - “创建 NSManagedObject 子类”
菜单中缺少 Xcode 11“创建 NSManagedObject 子类”
如何在 Xcode8 中手动触发 NSManagedObject 子类的生成