Coredata的CodeGen'手册/无+创建NSManagedObject子类'与'类别/扩展'之间的功能差异是什么?

Hon*_*ney 6 xcode core-data nsmanagedobject swift

我已经阅读了使用swift 3和Xcode 8 beta对NSManagedObject进行Subclassing,并阅读了这篇精彩的教程.在某些方面仍有疑问.

相似之处是:

  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.这里的例子

  4. 更改类型的可选性,如String?String只允许为Manual/None.这里的例子
  5. 仅允许更改属性访问级别,例如从更改public到.这里的例子privateManual/None

  6. 如果我选择了Manual/Nonecodegen但是没有选择'create NSManagedObject subclass' ,那就说有很大的不同.在那种情况下,我自己开始编写所有代码(来自NSManagedObject的子类并为每个属性编写NSManaged)...或者如果我自己不编写所有代码,那么我仍然可以使用KVC访问/设置字段,这很尴尬!

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

问:除了9个音符,我需要知道我是否正确验证,一个重要的问题是:如何做我更改NSDateDate或可选的非可选我的NSManagedObject类和我的对象图之间不打破映射所有同时改变破产的NSDate财产String!! 这是否与保证在Swift和Objective-C之间进行投射的事情有关,即可以通过的事情as- 没有?!

pba*_*sdf 6

要解决您的每个笔记并考虑将 codegen 设置为Manual/None和 的情况Category/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,或将其标记为私有,或其他 - 只能在这种Manual/None情况下完成,因为派生数据中的扩展文件会被每个新构建覆盖,因此任何更改都会丢失。
  7. 同上
  8. 同上
  9. 正确的。如果您使用 KVC 访问属性,则无需创建单独的 NSManagedObject 子类(自动或手动)即可编写您的应用程序。

最后一点:您不能随意更改属性定义的类型:模型编辑器中指定的类型必须与属性定义中指定的类型相对应。您可以在相同类型的可选和非可选版本之间切换,也可以在日期和 NSDate 等之间切换,但是从日期切换到字符串将不起作用。我怀疑您是正确的,这是由于 Swift 值类型和使用as. 见这里