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

时间:2014-08-25 11:50:54

标签: ios swift subclass nsmanagedobject

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

CoreData编辑器:

enter image description here

生成的子类:

enter image description here

预期:

enter image description here

更新: 它本身就是乏味,因为每次我想重新生成子类时,都意味着我还需要手动更新所有可选值。在子类中使用非可选(没有'?')会导致我在分配之前检查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)

在我的情况下,我需要手动标记为可选的一堆属性。

2 个答案:

答案 0 :(得分:45)

核心数据模型编辑器中的可选复选框已在Swift及其引入的选项之前存在。 Apple在其Core Data Programming Guide中声明了这一点:

  

您可以指定属性是可选的 - 也就是说,不是   需要有价值。但是,一般来说,你是沮丧的   从这样做 - 特别是对于数值(通常你可以得到   使用具有默认值的强制属性更好的结果 - 在   模型 - 0)。原因是SQL有特殊的比较   NULL的行为与Objective-C的不同之处。数据库中为NULL   与0不同,搜索0与列不匹配   NULL。

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

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


附录

每当您为数据模型检查器中的每个实体属性更改此选项并重建时,

Mogenerator都能够自动将NSManagedObject子类属性从非可选属性切换为可选属性你的项目。

答案 1 :(得分:9)

解决方法:

是的,这似乎是一个错误/限制。 使用非标量类型来解决此问题。

可选属性

  • 选中可选复选框
  • 取消选中标量复选框

非可选属性

  • 取消选中可选复选框
  • 检查标量复选框

可能的原因:

Swift代码被转换为Objective-C,而Objective-C不支持非类类型的nil值。