我已经阅读Subclassing NSManagedObject with swift 3 and Xcode 8 beta并阅读了this很棒的教程。在某些方面仍有疑问。

相似之处是:

  • 我可以自定义两个类。
  • 我可以添加新属性或删除或重命名属性。例如,对于category/extension,它将在新版本上(在派生数据中)进行更新,对于manual/none,它将使类文件保持不变,并在文件导航中更新扩展名,即,我不会得到重复的文件。这全部由Xcode处理,因为它们被标记了预处理器@NSManaged
  • 不允许直接将类似@NSManaged public var name: String?的内容转储到现有NSManagedObject子类中。我尝试执行entity.name = "John",但出现以下错误:reason: '-[SomeEntity setName:]: unrecognized selector sent to instance 0x60400009b120'。我相信这是合理的。我认为如果不使用Core Data Model Editor,则不会创建setter/getter访问器方法。

  • 不同之处在于:
  • 对于Category/Extension,您只需要自己创建类并添加所需的任何其他功能/属性。
  • 对于Category/Extension,在足够的派生数据中创建属性。因为您永远都不需要看到该文件。它的存在足以使事情正常进行。

    特别是在更改NSManaged属性的上下文中:
  • 更改属性类型,例如从NSDateDate,仅允许Manual/None。示例here
  • 更改类型的可选性,例如从String?String,仅允许Manual/None。示例here
  • 更改属性访问级别,例如从publicprivate仅适用于Manual/None。示例here
  • 话虽如此,如果我选择Manual/None codegen,但是不要选择'create NSManagedObject subclass',那会有很大的不同。在那种情况下,我已经开始自己编写所有代码(来自NSManagedObject的子类,并为每个属性编写NSManaged)...或者,如果我自己不编写所有代码,那么我仍然可以使用KVC来访问/设置字段,这很尴尬!

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

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

    最佳答案

    要解决您的每个注释并考虑将codegen设置为Manual/NoneCategory/Extension的情况:

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

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

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

    10-12 14:31