[英]How to force update CoreData Codefiles (Property Extension) in Swift 5?
我对 CoreData 有点困惑。 在我的xcdatamodeld
,我能够创建新属性并更改有关它们的一些内容,例如它们是否是可选的。
例如,我为我的实体创建了一个属性并将其命名为 descrip ,类型是
String
并且我检查了Optional Field
。
在其他时候,我尝试创建该实体的新 Object 并将其安全地保存到 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'
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
数据 model 和生成的代码之间存在差异,因为 Swift 选项和 Core Data 选项是完全不同的东西。 Core Data 只关心保存更改时是否有可选内容。 Swift 始终关心某些东西是否是可选的。 这是不同的,因为 Core Data 在 Swift 存在之前已经存在了很长时间,所以它并不总是与 Swift 的预期相匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.