【问题标题】:Swift + CoreData: Cannot Automatically Set Optional Attribute On Generated NSManagedObject SubclassSwift + CoreData:无法在生成的 NSManagedObject 子类上自动设置可选属性
【发布时间】:2014-10-18 13:35:00
【问题描述】:

我有一个名为 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)

就我而言,我有一堆属性需要手动标记为可选。

【问题讨论】:

  • 更新:这已经在 Xcode 7.1 中实现了。
  • 我在 XCode 11.3.1 中仍然有这个问题。 “这已经在 Xcode 7.1 中实现”是什么意思?

标签: ios swift subclass nsmanagedobject


【解决方案1】:

Core Data Model Editor 中的可选复选框在 Swift 及其可选选项引入之前就已经存在。苹果在其Core Data Programming Guide 中声明了这一点:

你可以指定一个属性是可选的——也就是说,它不是 需要有一个值。但是,一般情况下,您会感到气馁 这样做——尤其是对于数值(通常你可以得到 使用具有默认值的强制属性获得更好的结果 — 在 型号 — 0)。原因是SQL有特殊的比较 NULL 的行为与 Objective-C 的 nil 不同。数据库中的 NULL 与 0 不同,搜索 0 将不会匹配具有 空。

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

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


附录

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

【讨论】:

  • 请查看我更新的问题。我明白你的意思。我希望 xcode6 的发布版本能够支持这种情况。谢谢你。会将您的答案标记为正确。
  • 这很痛苦。我有很多可选字段。
  • 我看不出核心数据编程指南中引用的段落与答案的其余部分有什么关系。
【解决方案2】:

解决方法:

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

可选属性

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

非可选属性

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

可能的原因:

Swift 代码被翻译成 Objective-C 并且 Objective-C 不支持非类类型的 nil 值。

【讨论】:

  • 我想你的意思是说 Objective-C 不支持非类(原始)类型的 nil 值。澄清一下:NSNumber 类可能是 nil,原始类型不能——正如您所说的,为什么对于可选属性,您必须取消选中标量复选框。
  • 感谢根据您的建议更正。对于可选属性,取消选中标量复选框,以便您可以使用非标量类型,例如 NSNumber
  • Swift 不会被翻译成 Objective-C,它会直接编译成二进制文件。 Swift 不是 Objective-C 的包装器,而是它自己的语言。
  • @AlecO,Swift 还不是一门完整的语言。引擎盖下还有很多东西仍然是 Objective-C。这就是为什么在某些情况下(例如 Core Data 类文件)需要 @objc@nonobjc 等属性的原因。此外,前面带有NS 的任何东西仍然是基于Objective-C 的,例如NSFetchRequestNSManagedObject。服务器端 Swift(可以在 Linux 中使用)由完整的 Swift 框架组成,没有底层的 Objective-C。你还没有看到 Core Data...
  • 我不太确定如何使用此解决方法。我希望我的 Doubles 是可选的,但如果我取消选中 Use Scalar Types,那么我必须对所有内容使用 NSNumber,这本身就是一个怪物。
猜你喜欢
  • 2014-08-11
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2014-10-19
  • 1970-01-01
相关资源
最近更新 更多