Coredata的CodeGen“手动/无+创建NSManagedObject子类”与“类别/扩展名”

时间:2018-12-21 21:55:25

标签: 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'。我相信这是合理的。我认为如果不使用Core Data Model Editor,则不会创建setter / getter访问器方法。

区别是:

  1. 对于Category/Extension,您只需要自己创建类并添加所需的任何其他功能/属性。
  2. 对于Category/Extension,属性已在足够的派生数据中创建。因为您永远不需要查看该文件。它的存在足以使一切正常。

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

  3. 更改属性类型,例如NSDate仅允许DateManual/None。示例here

  4. 更改类型的可选性,例如String?仅允许StringManual/None。示例here
  5. 更改属性访问级别,例如public仅允许从privateManual/None的范围。示例here

  6. 如果我选择Manual/None代码生成器,但是不要选择“创建NSManagedObject子类”,则表示存在很大差异。在那种情况下,我已经开始自己编写所有代码(来自NSManagedObject的子类,并为每个属性编写NSManaged)...或者,如果我自己不编写所有代码,那么我仍然可以使用KVC访问/设置字段,这很尴尬!

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

问题:除了我需要知道是否正确验证的9个笔记之外,一个重要的问题是:我将NSDate更改为Date或将可选参数更改为非可选参数不会破坏我的NSManagedObject类与对象图之间的映射,而将NSDate属性更改为String确实会破坏! !这是否与保证在Swift和Objective-C之间进行强制转换的事物有关,即可以通过as进行强制转换的事物-无需?!

1 个答案:

答案 0 :(得分:3)

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

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