Swift Core Data codegen如何决定是否将属性设置为可选?

Swift Core Data codegen如何决定是否将属性设置为可选?,swift,xcode,core-data,Swift,Xcode,Core Data,我正在macOS 10.13.6 High Sierra上使用Xcode 10+Swift 4.2。我已经创建了一个数据模型,我让核心数据自动为数据模型实体生成类。在大多数情况下,这是可以预期的。但是,我不知道如何预测生成的类中的某些属性是否将是可选的类型;它似乎并不取决于相应的属性是否声明为“可选”(即在属性描述中选中了“可选”复选框)。有人能帮我弄清楚Xcode是如何决定是否将类属性设置为可选的吗 下面是我从我的项目中得到的一个小例子。我只是用虚构的名称替换了特定于项目的名称,但其他所有名称

我正在macOS 10.13.6 High Sierra上使用Xcode 10+Swift 4.2。我已经创建了一个数据模型,我让核心数据自动为数据模型实体生成类。在大多数情况下,这是可以预期的。但是,我不知道如何预测生成的类中的某些属性是否将是
可选的
类型;它似乎并不取决于相应的属性是否声明为“可选”(即在属性描述中选中了“可选”复选框)。有人能帮我弄清楚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?

}
扩展Foo{ @nonobjc公共类func fetchRequest()->NSFetchRequest{ 返回NSFetchRequest(entityName:“Foo”) } @NSManaged public var v1:日期? @NSV管理的公共var v2:Bool @NSManaged公共变量v3:Bool @NSV管理的公共var v4:UUID? @NSManaged public var v5:字符串? @NSManaged public var v6:NSSet? } 如您所见,v2和v3不是可选的,而v1、v4、v5和v6是可选的,这与数据模型中的可选/非可选分配不同

有人能帮我理解核心数据是如何决定生成的类属性是可选的还是非可选的吗

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

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

提前感谢您提供的任何信息


编辑:关于与可选属性相对应的非可选属性的最后一点,我可以省略
——当然,关于将non-optional与nil进行比较的警告仍然存在,但是错误消失了。这是一个解决办法。

我想你可以看看
属性选项卡,这里有
optional=“YES”
。它决定该属性是否是可选的。您可以在
数据模型插入检测中取消选中
可选
,进行更改


核心数据仍然植根于Objective-C。因此原语(
bool
int
float
等)将是非可选的,而对象将是可选的


有些数据可以是对象,也可以是基元。例如,某人的年龄可能是
NSNumber
NSInteger
。如果您希望这样的变量由基元支持,那么您可以选中模型中属性的
scalar
框。

这可能会有所帮助:@MikeTaverne感谢您的链接。我的问题和那差不多。作为记录,我发现第二个投票较少的答案更有帮助:谢谢你的回答。不幸的是,复选框是否被选中并不能确定属性在生成的类中是否被声明为可选的,正如您在v1(在数据模型中不是可选的,但在类属性中是可选的)、v2(在数据模型中不是可选的,在类中不是可选的)和v3的示例中所看到的(在数据模型中是可选的,在类中不是可选的)。我建议您手动生成
Foo+CoreDataProperties.swift
并按预期删除
。它应该正常工作,这似乎是一个限制。核心数据中的可选复选框不会转换为swift中的可选概念。请参阅