swift - Coredata 的 CodeGen 'manual/none + create NSManagedObject subclass' 与 'category/extension' 之间的功能差异是什么

标签 swift xcode core-data nsmanagedobject

我读过 Subclassing NSManagedObject with swift 3 and Xcode 8 betathis 很棒的教程。还有一些问题。

相同点是:

  1. 我可以随心所欲地自定义这两个类。
  2. 我可以添加新属性或删除或重命名属性。即对于 category/extension 它将在新构建时得到更新(在派生数据中),而对于 manual/none 它将保持类文件完整并更新文件导航中的扩展名,即我不会以重复文件结束。这一切都由 Xcode 处理,因为它们标有预处理器 @NSManaged
  3. 不允许将类似@NSManaged public var name: String? 的内容直接转储到现有的NSManagedObject 子类中。我尝试执行 entity.name = "John" 但出现以下错误:reason: '-[SomeEntity setName:]: unrecognized selector sent to instance 0x60400009b120'。我相信这是合理的。我认为如果不使用核心数据模型编辑器,就不会创建 setter/getter 访问器方法。

区别是:

  1. 对于 Category/Extension,您只需自己创建类并添加您需要的任何额外功能/属性。
  2. 对于 Category/Extension,属性是在派生数据中创建的,这就足够了。因为您永远不需要查看该文件。它的存在足以让事情正常进行。

    特别是在对您的 NSManaged 属性进行更改的情况下:

  3. 更改属性类型,例如NSDateDate 只允许 Manual/None 。示例 here

  4. 改变类型的可选性,例如String?String 仅允许 Manual/None。示例 here
  5. 更改属性访问级别,例如从 publicprivate 只允许 Manual/None。示例 here

  6. 话虽如此,但如果我选择Manual/None codegen 并且不要选择'create NSManagedObject子类'。在那种情况下,我已经开始自己编写所有代码(NSManagedObject 的子类并为每个属性编写 NSManaged)...或者如果我不自己编写所有代码,那么我仍然可以使用 KVC 访问/设置字段,这很尴尬!

简而言之,我只是想弄清楚使用 Manual/None 可以获得的全部功能。

问题:除了我需要知道我是否已正确验证的 9 个注释之外,一个重要的问题是:如何我将 NSDate 更改为 Date 或将可选更改为非可选 在更改 NSDate 属性时不会破坏我的 NSManagedObject 类和我的对象图之间的映射String 确实中断了!!这是否与保证在 Swift 和 Objective-C 之间进行转换的事情有关,即可以通过 as 进行转换的事情——没有 ?!?

最佳答案

处理您的每条笔记并考虑将代码生成设置为 Manual/NoneCategory/Extension 的情况:

  1. 是的,无论哪种情况,您都可以根据自己的喜好自定义类(在限制范围内 - 例如,该类必须是 NSManagedObject 的直接或间接子类)。
  2. 正确。您可以在模型编辑器中添加、修改或删除属性。在Category/Extension 的情况下,会自动进行相关的修改。在 Manual/None 情况下,您可以手动更新扩展(或类文件),也可以重做“创建 NSManagedObject 子类”,这将使用修改后的属性详细信息更新扩展。如果您不这样做,Xcode 将无法识别新的属性详细信息,并且不会为它们提供代码完成(如果您尝试覆盖代码完成,它也不会成功编译)。但与您认为的不同,这与标记为 @NSManaged 的属性无关。
  3. 正确。将 @NSManaged 属性添加到类定义(或扩展)足以告诉 Xcode 该属性存在(因此您可以在代码中引用它们)但不会创建相应的 getter/setter。所以你的代码会崩溃。
  4. 是的,对于 Category/Extension,只需根据需要创建和定制类文件即可。
  5. 是的,对于 Category/Extension,属性在派生数据中自动创建的扩展文件中声明。
  6. 以任何方式更改属性定义 - 从 Date 到 NSDate,或将其标记为私有(private),或其他 - 只能在 Manual/None 情况下完成,因为派生数据中的扩展文件被覆盖对于每个新构建,所有更改都会丢失。
  7. 同上
  8. 同上
  9. 正确。如果您使用 KVC 访问属性,则无需创建单独的 NSManagedObject 子类(自动或手动)即可编写您的应用。

关于您的最后一点:您不能任意更改属性定义的类型:模型编辑器中指定的类型必须与属性定义中指定的类型相对应。您可以在相同类型的可选版本和非可选版本之间切换,您可以在 Date 和 NSDate 之间切换等,但是从 Date 切换到 String 将不起作用。我怀疑你是对的,这是由于使用 as 桥接了 Swift 值类型和相应的 Objective-C 引用类型。参见 here .

关于swift - Coredata 的 CodeGen 'manual/none + create NSManagedObject subclass' 与 'category/extension' 之间的功能差异是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53891194/

相关文章:

ios - Swift Progress View 值传递函数

ios - 类型 'Item' 的值没有成员 'parentCategory'

ios - 使用 performBackgroundTask 更新 NSFetchedResultsController

ios - 如何使用 ScrollView 制作可滚动标签?

arrays - 数组和随机化的问题

ios - UICollectionView 使用组合布局在同一部分中查看多个单元格类型

swift - 如何在 Swift 3 中将小数二进制转换为十进制小数?

php - iPhone xCode 插入 mySQL

ios - iPad 上的 UISplitView - 我的结构是否正确?

iphone - 应用程序必须准备好在 iTunes Connect 上上传,然后才能在 Xcode 中验证或提交