如何在Swift 5中强制更新CoreData代码文件(属性扩展)?

问题描述 投票:0回答:1

我对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
}

有什么方法可以强制更新此代码文件?或如何使用可选字符串填写新实体的可选值?

ios swift xcode core-data optional
1个回答
0
投票

该分配中的错误不是核心数据问题,而是纯Swift。您已经将descrip声明为String,但是您正在尝试分配String?值。在Swift中这是不合法的-您必须先取消包装可选参数,然后再将其分配给非可选参数。如果您不使用Core Data,那将是相同的。例如,这将产生相同的错误:

let foo: String? = "hello"
let bar: String = foo

之所以会出现数据模型和生成的代码之间的差异,是因为Swift可选和Core Data可选完全不同。保存更改时,核心数据仅关心是否可选的内容。 Swift一直在乎某些东西是否是可选的。这是不同的,因为Core Data在Swift出现之前已经存在了很长时间,因此它并不总是与Swift期望的相符。

© www.soinside.com 2019 - 2024. All rights reserved.