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

All*_*rao 43 subclass nsmanagedobject ios swift

我有一个名为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 
}
Run Code Online (Sandbox Code Playgroud)

但是如果xcode可以在子类中使用(?)自动设置可选值,我只需要这样做:

branch.dateUpdated = self.coreData.serverUTCDateFormatter.dateFromString(dateString)
Run Code Online (Sandbox Code Playgroud)

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

Ima*_*tit 45

核心数据模型编辑器中的可选复选框已在Swift及其引入的选项之前存在.Apple在其核心数据编程指南中陈述了它:

您可以指定属性是可选的 - 也就是说,不需要具有值.但是,一般情况下,不鼓励您这样做 - 特别是对于数值(通常,您可以使用具有默认值的强制属性 - 在模型中为0)获得更好的结果.原因是SQL对NULL有特殊的比较行为,与Objective-C的nil不同.数据库中的NULL与0不同,搜索0将不匹配NULL的列.

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

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


附录

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

  • 这是一种痛苦.我有很多可选字段. (7认同)

use*_*037 9

解决方法:

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

可选属性

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

非可选属性

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

可能的原因:

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

  • 我想你的意思是说Objective-C不支持非类(原始)类型的_nil_值.为了澄清:NSNumber类可能是nil,原始类型不能 - 正如你所说的为什么对于可选属性你必须取消选中标量复选框. (2认同)
  • 我不太确定如何使用这种解决方法。我希望我的双打是可选的,但是如果我取消勾选“使用标量类型”,那么我必须对所有内容都使用 NSNumber,这本身就是一个怪物。 (2认同)