Я работаю с 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 все еще есть, но ошибка исчезает.Так что это обходной путь.