我有一个名为Record的coredata实体,并且有一个属性dateUpdated。我注意到生成的NSManagedObject子类没有可选标记(?)
CoreData编辑器:
生成的子类:
预期:
更新: 它本身就是乏味,因为每次我想重新生成子类时,都意味着我还需要手动更新所有可选值。在子类中使用非可选(没有'?')会导致我在分配之前检查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)
在我的情况下,我需要手动标记为可选的一堆属性。
答案 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值。