Ios Swift&x2B;CoreData:无法在生成的NSManagedObject子类上自动设置可选属性

Ios Swift&x2B;CoreData:无法在生成的NSManagedObject子类上自动设置可选属性,ios,swift,subclass,nsmanagedobject,Ios,Swift,Subclass,Nsmanagedobject,我有一个名为Record的coredata实体,并有一个属性dateUpdated。我注意到生成的NSManagedObject子类没有可选标记(?) 核心数据编辑器: 生成的子类: 期望值: 更新: 在我看来,这是乏味的,因为每次我想重新生成子类时,这意味着我还需要手动更新所有可选值。在子类中有一个非可选(不带“?”)导致我在赋值之前检查evalue,如下例: // sample value: // serverDateFormatter = "yyyy/MM/dd" // dateSt

我有一个名为Record的coredata实体,并有一个属性dateUpdated。我注意到生成的NSManagedObject子类没有可选标记(?)

核心数据编辑器:

生成的子类:

期望值:

更新: 在我看来,这是乏味的,因为每次我想重新生成子类时,这意味着我还需要手动更新所有可选值。在子类中有一个非可选(不带“?”)导致我在赋值之前检查evalue,如下例:

// sample value:
// serverDateFormatter = "yyyy/MM/dd"
// dateString = ""    

// Branch is a subclass of Record (see above images)

var date = self.coreData.serverDateFormatter.dateFromString(dateString)
if date != nil
{
   branch.dateUpdated = date 
}
但是,如果xcode可以用(?)自动设置子类中的可选值,我只需要这样做:

branch.dateUpdated = self.coreData.serverUTCDateFormatter.dateFromString(dateString)

在我的例子中,我有很多属性需要手动标记为可选。

在引入Swift及其选项之前,核心数据模型编辑器中的可选复选框已经存在。苹果公司在其声明中表示:

您可以指定属性是可选的,也就是说,它不是可选的 需要有一个值。然而,总的来说,你会感到气馁 通过这样做-尤其是对于数值(通常可以 在 模型-0)。这是因为SQL具有特殊的比较功能 与Objective-C的nil不同的NULL行为。数据库中的NULL 与0不同,对0的搜索将不匹配 空

因此,使用Swift和Xcode 8,“可选”复选框(仍然)与您是否在managedObject子类中将属性定义为optionals无关。当您使用编辑器>创建NSManagedObject子类创建子类属性可选类型时,不要期望可选复选框对您的
NSManagedObject
子类属性可选类型有任何影响

也就是说,每次我需要在模型编辑器中选中属性的可选复选框时,我都会立即将其
NSManagedObject
子类声明作为可选项


补遗 每次在数据模型检查器中为每个实体的属性更改此选项并重建项目时,都能够自动将
NSManagedObject
子类属性从非可选切换为可选。

解决方法: 是的,这似乎是一个缺陷/限制。 使用非标量类型解决此问题

可选属性
  • 选中可选复选框
  • 取消选中标量复选框
非可选属性
  • 取消选中可选复选框
  • 选中标量复选框
可能的原因:
Swift代码被转换为Objective-C,Objective-C不支持非类类型的零值。

请查看我的更新问题。我明白你的意思。我希望xcode6的发布版本能够支持这种情况。非常感谢。我会将你的答案标记为正确。这是一种痛苦。我有很多可选字段。我看不出核心数据编程指南中引用的段落与答案的其余部分有什么关系。更新:这已经在Xcode 7.1中实现了。相关的,我在Xcode 11.3.1中仍然存在这个问题。你说“这已经在Xcode 7.1中实现了”是什么意思?我想你的意思是说Objective-C不支持非类(基元)类型的nil值。澄清一下:NSNumber类可能是nil,而基元类型不能-正如您所说的,对于可选属性,您必须取消选中标量复选框。谢谢按照您的建议更正。对于可选属性,取消选中标量复选框,以便您可以使用非标量类型,如
NSNumber
Swift。如果Swift未转换为Objective-C,它将直接编译为二进制。Swift不是Objective-C的包装器,而是它自己的语言。@AlecO,Swift还不是一种完整的语言。有许多事情仍然是客观的-C的引擎盖下。这就是为什么在某些情况下(例如核心数据类文件)需要
@objc
@nonobjc
等属性的原因。此外,前面使用
NS
看到的任何内容仍然是基于客观的,例如
NSFetchRequest
NSManagedObject
。服务器端Swift(可以在Linux中使用)由完整的Swift框架组成,没有底层的Objective-C。您在那个里看不到核心数据,但……我真的不知道如何利用这个解决方法。我希望我的双打是可选的,但如果我取消勾选
使用标量类型
,那么我必须对所有内容使用NSNumber,这本身就是一个怪物。