Swift + CoreData:不能在生成的NSManagedObject子类上自动设置可选属性
我有一个名为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)
在我的情况下,我有一堆属性,我需要手动标记为可选。
核心数据模型编辑器中的可选checkbox在Swift及其引入的选项之前已经存在。 苹果公司在其“ 核心数据编程指南”中说到:
你可以指定一个属性是可选的 – 也就是说,它不需要有一个值。 但是,通常情况下,您不鼓励这样做 – 特别是对于数值(通常您可以使用具有默认值的强制属性(在模型中为0)获得更好的结果)。 这样做的原因是SQL对NULL的特殊比较行为与Objective-C的nil不同。 数据库中的NULL不等于0,search0将不匹配具有NULL的列。
因此,使用Swift和Xcode 8,可选checkbox(仍然)与您将属性定义为可选项或不在managedObject子类中的事实无关。 不要指望可选checkbox在您使用Editor > Create NSManagedObject Subclass创build它们时对您的NSManagedObject
子类属性可选types有任何影响。
也就是说,每当我需要一个属性在模型编辑器中选中它的可选checkbox,我立即把它的NSManagedObject
子类声明作为一个可选项。
附录
每次在数据模型检查器中为每个实体属性更改此选项并重build项目时, Mogenerator都能够自动将NSManagedObject
子类属性从非可选项切换为可选项。
解决方法:
是的,这似乎是一个错误/限制。 使用非标量types来解决这个问题。
可选属性
- 选中可选checkbox
- 取消选中标量checkbox
非可选属性
- 取消选中可选checkbox
- 选中标量checkbox
可能的原因:
Swift代码被转换成Objective-C,而Objective-C不支持非类types的nil值。