【问题标题】:SwiftUI core data optional and non-optional propertiesSwiftUI 核心数据可选和非可选属性
【发布时间】:2022-01-15 06:30:41
【问题描述】:

我在使用核心数据实体和 SwiftUI 时遇到问题。在我看来,一些属性在它们应该是非可选的时候是非可选的,我不明白为什么。

这是我的Entry核心数据实体:

这是我尝试在视图中使用它的方式:

if entry.text != nil {
    Text(entry.text!)
}

if entry.number != nil {
    Text("\(entry.number, specifier: "%.0f")")
}

if entry.boolean != nil {
    Text(entry.boolean ? "True" : "False")
}

我的问题是对于entry.numberentry.boolean,swift 抱怨Comparing non-optional value of type 'Double' to 'nil' always returns true

entry.text 不会发生这种情况。我已经通过运行print(entry)numberboolean 来检查这些值是nil 在持久存储中。

我了解核心数据选项和 swift 选项是不同的。但是,在这种情况下,所有 Entry 属性不应该都是可选的吗?为什么 SwiftUI 抱怨他们不是?

【问题讨论】:

  • 如果你打算这样使用它们,你真的应该使用if let 来解开你的选项。
  • @Andrew 这是一个很棒的提示,非常感谢!

标签: ios swift core-data swiftui


【解决方案1】:

当您创建实体时,Boolean 和 Double 的默认设置是使用标量(原始)类型,它们是非可选的,因为 Objective-C(这是 Core Data 的基础)无法处理可选的标量类型.

这是它们在代码中的定义方式

@NSManaged public var boolean: Bool
@NSManaged public var number: Double

如果您取消选中使用标量类型 (Inspector Cmd-alt-0),则基础类型将改为 NSNumber,它们将是可选的

@NSManaged public var number: NSNumber?
@NSManaged public var boolean: NSNumber?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多