(zuerst bemerkt auf: Xcode 8.2.1, iOS 10, Swift 3) (immer noch vorhanden von: Xcode 9 Beta 3, iOS11, Swift 4)
Wir alle wissen, dass das Core Data
-Konzept von optionals
vorangeht und nicht unbedingt an das Swift
-Konzept von optionals
gebunden ist.
Und wir haben akzeptiert, dass, selbst wenn das Attribut Core Data
als Non-optional
markiert ist, die automatisch generierte NSManagedObject
-Unterklasse einen optional
-Typ hat:
(Manche Leute entfernen manuell ?
ohne Nebenwirkungen, andere nicht, aber das ist nebensächlich)
(Von hier auf dem Beispiel und Screenshots sind für Bool
Eigenschaften, aber das gleiche gilt für Int16/32/64
, Double
, Float
)
Jetzt habe ich das Umgekehrte bemerkt - wenn ein Core Data
Attribut des Typs Bool
als Optional
markiert ist (und Use Scalar Type
ausgewählt ist, was Xcode standardmäßig tut), hat die automatisch generierte Klasse eine Variable von a non-optional
type.
Macht das Sinn? Ist es ein Fehler? Ist das Verhalten überall dokumentiert?
Und am wichtigsten - wie stelle ich eigentlich ein optionales Bool
dar?
Ich kann mir einige Workarounds vorstellen, aber sie scheinen nicht ideal zu sein (zB keine Skalare zu verwenden, aber zurück zu NSNumber
Repräsentation von Bool
. Oder (noch schlimmer) mit einem separaten Bool
etwas wie isVerified_isSet
)
Hinweis: Ich habe noch ein paar Tests gemacht und wenn Default Value
auf None
oder NO
gesetzt ist, wird die Variable als false
gespeichert (auch wenn ich sie nie in meinem Code zugewiesen habe) . Wenn Default Value
auf YES
gesetzt ist, wird die Variable als true
gespeichert. Dies bedeutet jedoch, dass es (scheinbar) keine Möglichkeit gibt, diese Variable logisch als noch nicht gesetzt darzustellen.
Ich sehe das Gleiche und halte es für einen Fehler. Es ist nirgendwo dokumentiert, dass ich finden kann. Scheinbar wendet Core Data Objective-C-Stil-Annahmen an, wobei ein boolescher Wert auf NO
und ein Integer-Wert auf 0 voreingestellt ist. Die Core Data / Swift-Schnittstelle hat einige Ecken und Kanten, und das ist eine, die ich vorher nicht berücksichtigt hatte.
Es ist ein guter Fund, aber ich denke, Sie sind dran, bis Apple es anspricht. Du kennst bereits die besten Workarounds, denen ich zustimme, sind nicht großartig. Ich empfehle einen Fehler zu archivieren.
Das passiert, weil skalare Objective-C-Typen keine Nullwerte haben. Quelle: handling-core-data-optional-scalar-attribute