Как Core Data codegen решает, делать ли свойство необязательным? - PullRequest
0 голосов
/ 02 марта 2019

Я работаю с Xcode 10 + Swift 4.2 на macOS 10.13.6 High Sierra.Я создал модель данных и позволяю Core Data автоматически генерировать классы для объектов модели данных.По большей части это работает как ожидалось.Однако я не могу понять, как предсказать, будут ли некоторые свойства в сгенерированных классах Optional типов;он не зависит от того, были ли соответствующие атрибуты объявлены как «Необязательные» (т. е. в описании атрибута установлен флажок «Необязательно»).Может кто-нибудь помочь мне выяснить, как 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 объявлены необязательными.Вот сгенерированный код, который я нашел в Foo + CoreDataProperties.swift где-то в папке Xcode / DerivedData для моего проекта.

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?

}

Как вы можете видеть, v2 и v3 не являются обязательными, в то время как v1, v4, v5 и v6 являются необязательными, и это назначение необязательных / необязательных отличается от того, что было замечено в модели данных.

Может кто-нибудь помочь мне понять, как Core Data решает, является ли свойство сгенерированного классадолжен быть необязательным или необязательным?

С одной стороны, я пишу v!.something, где я хотел бы надеяться, что смогу написать v.something, потому что v не является обязательным в модели данных, и, следовательно, определенно будет какое-то значениенастоящее (при условии, что базовые данные приводят в действие необязательный атрибут).

И с другой стороны, я хочу написать let v = v { ... } для свойства v, которое является необязательным в модели данных, поэтому может присутствовать или не присутствовать значение.XCode дает мне ошибку об этой конструкции, но я не могу пропустить тест - я уже знаю, что некоторые экземпляры v будут отсутствовать.Попытка обойти это путем написания if v != nil { v! } не удалась - Xcode выдает ошибку о невозможности развернуть не необязательное значение (а также предупреждение о сравнении необязательного с nil).

Спасибо взаранее за любой свет, который вы можете пролить на это.

РЕДАКТИРОВАТЬ: Для последнего бита о необязательном свойстве, соответствующем необязательному атрибуту, я вижу, что я могу просто опустить ! и написать if v != nil { v }- конечно, предупреждение о сравнении необязательного с nil все еще есть, но ошибка исчезает.Так что это обходной путь.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Базовые данные все еще основаны на Objective-C.Таким образом, примитивы (bool, int, float и т. Д.) Не будут опциональными, а объекты будут опциональными.

Некоторые данные могут быть либо объектом, либо примитивом.Например, чей-то возраст может быть NSNumber или NSInteger.Если вы предпочитаете, чтобы такая переменная поддерживалась примитивом, вы можете установить флажок scalar для свойства в вашей модели.

0 голосов
/ 02 марта 2019

Я думаю, вы могли бы взглянуть на attribute вкладку, там optional="YES".Было решено, является ли это свойство необязательным или нет.Вы можете внести изменения без отметки optional в Data Model insepector

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...