我对CoreData有点困惑。在我的xcdatamodeld
中,我可以创建新属性并更改它们的某些内容,例如无论它们是否可选。
例如,我为我的实体创建了一个属性并称为描述,类型为
String
,然后检查了Optional Field
。
[在其他时候,我尝试创建该实体的新对象并将其保存到CoreData:
let newEntity = Entity(context: context)
newEntity.name = name
newEntity.descrip = descrip // descrip is an optional String
newEntity.filename = filename
我收到以下错误消息:Value of optional type 'String?' must be unwrapped to a value of type 'String'
然后,我尝试为我的实体创建NSManagedObjectSubclasses。 我发现,虽然已经添加了所有属性,并且所有类型的设置都正确,但是?表示该属性的可选性已完全搞砸了。
import Foundation
import CoreData
extension Entity {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Entity> {
return NSFetchRequest<Entity>(entityName: "Entity")
}
@NSManaged public var name: String? // Should not be optional and was set so in xcdatamodeld
@NSManaged public var descrip: String // Should be optional and set to optional in xcdatamodeld
@NSManaged public var filename: String
}
有什么方法可以强制更新此代码文件?或如何使用可选字符串填写新实体的可选值?
该分配中的错误不是核心数据问题,而是纯Swift。您已经将descrip
声明为String
,但是您正在尝试分配String?
值。在Swift中这是不合法的-您必须先取消包装可选参数,然后再将其分配给非可选参数。如果您不使用Core Data,那将是相同的。例如,这将产生相同的错误:
let foo: String? = "hello"
let bar: String = foo
之所以会出现数据模型和生成的代码之间的差异,是因为Swift可选和Core Data可选完全不同。保存更改时,核心数据仅关心是否可选的内容。 Swift一直在乎某些东西是否是可选的。这是不同的,因为Core Data在Swift出现之前已经存在了很长时间,因此它并不总是与Swift期望的相符。