我已经阅读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属性的上下文中:
NSDate
到Date
,仅允许Manual/None
。示例here String?
到String
,仅允许Manual/None
。示例here public
到private
仅适用于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/None
和Category/Extension
的情况:
Category/Extension
情况下,将自动进行相关更改。在Manual/None
情况下,您可以手动更新扩展(或类文件),也可以重做“创建NSManagedObject子类”,这将使用修改后的属性详细信息更新扩展。如果不这样做,则Xcode将无法识别新的属性详细信息,也不会为其提供代码完成功能(如果您尝试覆盖代码完成功能,Xcode也不会成功编译)。但是与您认为的不同,这与标记为@NSManaged
的属性无关。 Category/Extension
,只需根据需要创建和定制类文件。 Category/Extension
,属性在“派生数据”中自动创建的扩展文件中声明。 Manual/None
情况下进行,因为每个新构建都会覆盖Derived Data中的Extension文件,因此所有更改都将丢失。 关于最后一点:您不能随意更改属性定义的类型:在模型编辑器中指定的类型必须与在属性定义中指定的类型相对应。您可以在相同类型的可选和非可选版本之间进行切换,并且可以在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/