我已经阅读了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
代码生成器,但是不要选择“创建NSManagedObject子类”,则表示存在很大差异。在那种情况下,我已经开始自己编写所有代码(来自NSManagedObject的子类,并为每个属性编写NSManaged)...或者,如果我自己不编写所有代码,那么我仍然可以使用KVC访问/设置字段,这很尴尬!
简而言之,我只是想弄清楚使用Manual/None
可以获得的全部功能。
问题:除了我需要知道是否正确验证的9个笔记之外,一个重要的问题是:我将NSDate
更改为Date
或将可选参数更改为非可选参数不会破坏我的NSManagedObject类与对象图之间的映射,而将NSDate
属性更改为String
确实会破坏! !这是否与保证在Swift和Objective-C之间进行强制转换的事物有关,即可以通过as
进行强制转换的事物-无需?
或!
?
答案 0 :(得分:3)
要解决您的每个注释并考虑将代码生成设置为Manual/None
和Category/Extension
的情况:
Category/Extension
情况下,相关更改将自动进行。在Manual/None
中,您可以手动更新扩展(或类文件),也可以重做“创建NSManagedObject子类”,这将使用修改后的属性详细信息更新扩展。如果不这样做,则Xcode将无法识别新的属性详细信息,也不会为其提供代码完成功能(如果您尝试覆盖代码完成功能,它也不会成功编译)。但是与您认为的不同,这与标记为@NSManaged
的属性无关。Category/Extension
,只需根据需要创建和定制类文件即可。Category/Extension
,属性是在自动创建的扩展文件中的“派生数据”中声明的。Manual/None
情况下完成,因为派生数据中的扩展文件被每个新构建覆盖,因此任何更改都将丢失。关于最后一点:您不能随意更改属性定义的类型:模型编辑器中指定的类型必须与属性定义中指定的类型相对应。您可以在相同类型的可选和非可选版本之间进行切换,并且可以在Date和NSDate等之间进行切换,但是从Date到String的切换将不起作用。我怀疑您是正确的,这是由于Swift值类型和使用as
的相应Objective-C引用类型之间的桥接。参见here。