Wie kann man in Swift Core Data optionale Skalare (Bool / Int / Double / Float) darstellen?

8

(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 )

genannt

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.

    
Nikolay Suvandzhiev 06.03.2017, 10:03
quelle

2 Antworten

5

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.

    
Tom Harrington 06.03.2017, 23:57
quelle
2

Das passiert, weil skalare Objective-C-Typen keine Nullwerte haben. Quelle: handling-core-data-optional-scalar-attribute

    
Arek 28.07.2017 08:46
quelle

Tags und Links