代码之家  ›  专栏  ›  技术社区  ›  mfaani

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

  •  6
  • mfaani  · 技术社区  · 6 年前

    Subclassing NSManagedObject with swift 3 and Xcode 8 beta this

    相似之处在于:

    1. 我可以自定义这两个类,但我喜欢。
    2. 我可以添加新属性或删除或重命名属性。工业工程 category/extension 它将在新构建时(在派生数据中)得到更新,如果 manual/none @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. 对于 类别/扩展

      ¨特别是在制定 变化

    3. 更改属性类型,例如。 NSDate Date 只允许 Manual/None . 例子 here

    4. 改变类型的可选性,例如。 String? String 只允许 手动/无 . 例子 在这里
    5. 更改属性访问级别,例如从 public private 只允许 手动/无 . 例子 here

    6. 话虽如此,两者之间存在着显著差异 如果 我选择 手动/无 不要 选择“创建NSManagedObject子类”。在这种情况下,我已经开始自己编写所有代码(NSManagedObject的子类,并为每个属性编写NSManaged)……或者如果我没有自己编写所有代码,那么我仍然可以使用KVC访问/设置字段,这很尴尬!

    简而言之,我只是想弄清楚我可以从使用 手动/无 .

    问题: 除了9号 笔记 我需要知道我是否正确验证了,一个重要的 问题 可能是:我是如何改变的 NSDate 或可选到非可选在更改 NSDate 一串 as 没有 ? !

    1 回复  |  直到 6 年前
        1
  •  6
  •   mfaani    6 年前

    解决您的每个注释,并考虑codegen设置为 Manual/None Category/Extension :

    1. 是的,在任何一种情况下,您都可以根据自己的喜好自定义类(在限制范围内-例如,该类必须是NSManagedObject的子类-直接或间接)。
    2. 对的可以在模型编辑器中添加、修改或删除属性。在 类别/扩展 在这种情况下,将自动进行相关更改。在 在这种情况下,您可以手动更新扩展名(或类文件),也可以重做“创建NSManagedObject子类”,该子类将使用修改后的属性详细信息更新扩展名。如果不这样做,Xcode将无法识别新的属性详细信息,也不会为它们提供代码完成(如果尝试覆盖代码完成,也不会成功编译)。但与您认为的不同,这与标记为 @NSManaged .
    3. 是的 类别/扩展 只需根据需要创建和定制类文件。
    4. 是的 类别/扩展
    5. 以任何方式更改属性定义(从Date更改为NSDate,或将其标记为private,或其他方式)只能在 因为派生数据中的扩展文件会被每个新生成覆盖,所以任何更改都会丢失。
    6. 同上
    7. 同上

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