【问题标题】:How to represent Core Data optional Scalars (Bool/Int/Double/Float) in Swift?如何在 Swift 中表示 Core Data 可选标量(Bool/Int/Double/Float)?
【发布时间】:2017-07-26 03:31:02
【问题描述】:

(首先注意到:Xcode 8.2.1、iOS 10、Swift 3) (仍然存在:Xcode 9 beta 3、iOS11、Swift 4)

我们都知道optionalsCore Data 概念在optionalsSwift 概念之前并且不严格绑定。

而且我们已经接受即使Core Data 属性被标记为Non-optional,自动生成的NSManagedObject 子类也有optional 类型:

(有些人手动删除? 没有任何不良影响,有些人没有,但那不是重点)

(此处的示例和屏幕截图适用于 Bool 属性,但同样适用于 Int16/32/64DoubleFloat

现在我注意到相反的情况 - 当 Bool 类型的 Core Data 属性被标记为 Optional (并且选择了 Use Scalar Type,Xcode 默认情况下),自动生成的类有一个变量non-optional 类型。

这有意义吗?它是一个错误吗?该行为是否记录在任何地方?

最重要的是 - 我如何实际表示可选的Bool

我可以想到一些变通方法,但它们似乎并不理想(例如,不使用标量,而是回到BoolNSNumber 表示。或者(更糟糕的是)有一个单独的Bool称为isVerified_isSet)


注意:我做了几个测试,如果 Default Value 设置为 NoneNO,那么变量将保存为 false(即使我从未在我的代码中实际分配它) .如果Default Value 设置为YES,则变量将保存为true。尽管如此,这意味着(显然)没有办法在逻辑上将此变量表示为尚未设置。

【问题讨论】:

  • 你解决了如何将 Bool 属性表示为尚未设置?
  • @Shamsiddin - Apple 方面没有任何更改/修复 - 因此您仍然需要使用解决方法(帮助程序 isSet 属性)或者可能是 Arek 答案中链接的文章中的建议。
  • 我认为临时解决方案之一是使用Integer 16(实体类文件中的NSNumber)和01 值而不是BooleanNSNumbertrue/false.

标签: ios swift xcode core-data


【解决方案1】:

我看到同样的事情,我认为这是一个错误。它没有记录在我能找到的任何地方。显然 Core Data 在这里应用了 Objective-C 风格的假设,其中布尔默认为 NO,整数默认为 0。Core Data/Swift 接口有一些粗糙的边缘,这是我以前没有考虑过的。

这是一个很好的发现,但我认为在 Apple 解决它之前你会一直坚持下去。您已经知道最好的解决方法,我同意这不是很好。我建议提交一个错误。

【讨论】:

  • 感谢您的回答。实际上,直到您提到它,我什至没有意识到所有标量类型都会发生相同的“问题”,而不仅仅是Bool。 (我现在已经修改了原始问题以提及这一点)。
  • 我不认为这是一个错误。 Core Data 在底层是 Objective-c 的,所以在发布 Swifty Core Data 之前期待 Objective-c 的行为。
  • 许多 Apple 框架在底层都是 ObjC,但如果支持 Swift 与它们一起使用,它们应该提供 Swifty 接口。
【解决方案2】:

这是因为 Objective-C 标量类型没有 nil 值的概念。来源:handling-core-data-optional-scalar-attributes

【讨论】:

    【解决方案3】:

    如果你在这里结束:

    @NSManaged var boolAttribute: Bool
    

    在 Objective-C 中看不到它,并且您已经在这些属性上禁用了“可选”并启用了“使用标量类型”,然后帮自己一个忙。

    仔细检查您是否已将 Swift 桥接头导入到该 Objective-C 文件中。

    我没有,而且,我大部分时间都将我的 Bools 更改为 NSNumbers,然后我才意识到自己是多么愚蠢。

    【讨论】:

      【解决方案4】:

      我宁愿使用 Objective-C 类型来管理这些情况,而不是 Swift 类型。 在这些情况下,对于标量类型,您可以使用 NSNumber。

       @NSManaged public var myDouble: NSNumber?
      

      在模型中 myDouble 是一个可选的 double,默认值为 nil。

      要获得真正的价值,你只需要使用:

      myEntity.myDouble?.doubleValue
      

      【讨论】:

        猜你喜欢
        • 2020-02-12
        • 2019-03-27
        • 2023-03-20
        • 1970-01-01
        • 2017-03-04
        • 2011-09-04
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        相关资源
        最近更新 更多