Как принудительно обновить файлы кода CoreData (расширение свойства) в Swift 5? - PullRequest
0 голосов
/ 28 мая 2020

Я немного запутался в CoreData. В моем xcdatamodeld я могу создавать новые свойства и изменять некоторые вещи в них, например , являются ли они необязательными или нет .

Например, я создал свойство для моей сущности и назвал его описанием , тип - String, и я проверил Optional Field.

В какой-то другой момент я пытаюсь создать новый объект этого Entity и сохраните его в 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 для моей Entity. Я обнаружил, что, хотя все свойства были добавлены и их тип установлен правильно, символ? указывает на то, что необязательность свойства была полностью нарушена.

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
}

Есть ли способ принудительно обновить этот файл кода? Или как я могу использовать необязательные строки для заполнения необязательных значений моей новой сущности?

1 Ответ

0 голосов
/ 28 мая 2020

Ошибка в этом назначении не является проблемой Core Data, это чистый Swift. Вы объявили descrip как String, но пытаетесь присвоить значение String?. В Swift это не законно - вы должны развернуть необязательный элемент, прежде чем назначать его необязательному. Было бы то же самое, если бы вы не использовали Core Data. Например, это приведет к той же ошибке:

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

Различия между моделью данных и сгенерированным кодом происходят потому, что опции Swift и опции Core Data - совершенно разные вещи. Core Data заботится только о том, является ли что-то необязательным при сохранении изменений. Swift все время заботится о том, является ли что-то необязательным. Это другое, потому что Core Data существовала задолго до того, как появился Swift, поэтому они не всегда совпадают с тем, что ожидает Swift.

...