gpt4 book ai didi

swift - Core Data 代码生成器如何决定是否将属性设为可选?

转载 作者:搜寻专家 更新时间:2023-10-31 22:53:18 24 4
gpt4 key购买 nike

我在 macOS 10.13.6 High Sierra 上使用 Xcode 10 + Swift 4.2。我创建了一个数据模型,并让 Core Data 自动为数据模型实体生成类。在大多数情况下,这按预期工作。但是,我无法弄清楚如何预测生成的类中的某些属性是否将成为 Optional 类型;它似乎不依赖于相应的属性是否被声明为“可选”(即在属性描述中选中“可选”复选框)。谁能帮我弄清楚 Xcode 如何确定是否将类属性设为可选?

这是我从我的项目中得出的一个小例子。我只是用虚构的名称替换了项目特定的名称,但其他一切都是一样的。首先是 Foo 实体描述的数据模型摘录:

<entity name="Foo" representedClassName="Foo" parentEntity="FooParent" syncable="YES" codeGenerationType="class">
<attribute name="v1" attributeType="Date" usesScalarValueType="NO" syncable="YES"/>
<attribute name="v2" attributeType="Boolean" usesScalarValueType="YES" syncable="YES"/>
<attribute name="v3" optional="YES" attributeType="Boolean" usesScalarValueType="YES" syncable="YES"/>
<attribute name="v4" optional="YES" attributeType="UUID" usesScalarValueType="NO" syncable="YES"/>
<attribute name="v5" optional="YES" attributeType="String" syncable="YES"/>
<relationship name="v6" toMany="YES" deletionRule="Nullify" destinationEntity="Bar"
inverseName="baz" inverseEntity="Bar" syncable="YES"/>
</entity>

如您所见,v1、v2 和 v6 在数据模型中未声明为可选,而 v3、v4 和 v5 声明为可选。这是生成的代码,我在我的项目的 Xcode/DerivedData 文件夹下的 Foo+CoreDataProperties.swift 中找到了它。

extension Foo {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Foo> {
return NSFetchRequest<Foo>(entityName: "Foo")
}

@NSManaged public var v1: Date?
@NSManaged public var v2: Bool
@NSManaged public var v3: Bool
@NSManaged public var v4: UUID?
@NSManaged public var v5: String?
@NSManaged public var v6: NSSet?

}

如您所见,v2 和 v3 不是可选的,而 v1、v4、v5 和 v6 是可选的,这是与数据模型中看到的不同的可选/非可选分配。

谁能帮我理解 Core Data 如何决定生成的类属性应该是可选的还是非可选的?

一方面,我发现自己写了 v!.something,我希望我可以写 v.something 因为 v在数据模型中是非可选的,因此肯定会有一些值存在(假设 Core Data 强制执行非可选属性)。

另一方面,我想为数据模型中可选的属性 v 编写 let v = v { ... },所以有可能是也可能不是值(value)存在。 Xcode 给我一个关于该构造的错误,但我不能省略测试——我已经知道 v 的某些实例将不存在。尝试通过编写 if v != nil { v! } 失败——Xcode 给出了关于无法解包非可选值的错误(以及关于将非可选值与 nil 进行比较的警告)。

在此先感谢您提供的任何信息。

编辑:关于与可选属性相对应的非可选属性的最后一点,我看到我可以省略 ! 并编写 if v != nil { v } ——当然,关于将非可选值与 nil 进行比较的警告仍然存在,但错误消失了。所以这是一个解决方法。

最佳答案

Core Data 仍然 Root 于 Objective-C。因此基元(boolintfloat 等)将是非可选类型,而对象将是可选类型。

一些数据可以是对象或基元。例如,某人的年龄可以是 NSNumberNSInteger。如果您希望此类变量由原语支持,则可以选中模型中属性的 scalar 框。

关于swift - Core Data 代码生成器如何决定是否将属性设为可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54954811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com