(最初に気づいたのは:Xcode 8.2.1、iOS 10、Swift 3)(Xcode 9ベータ3、iOS11、Swift 4)の時点でまだ存在
Core Data
のoptionals
の概念が先行し、Swift
のoptionals
の概念に厳密に結び付けられていないことは誰もが知っています。
また、Core Data
属性がNon-optional
としてマークされている場合でも、自動生成されたNSManagedObject
サブクラスにはoptional
タイプがあります。
(一部の人は手動で?
を削除しますが、悪影響はありませんが、一部は削除しませんが、それは重要です)
(ここから例とスクリーンショットはBool
プロパティ用ですが、Int16/32/64
、Double
、Float
についても同様です)
今、私はその逆に気づきました-タイプBool
のCore Data
属性がOptional
としてマークされているとき(そしてUse Scalar Type
が選択され、Xcodeはデフォルトで行います)、自動生成されたクラスには、non-optional
型の変数があります。
これは理にかなっていますか?バグですか?動作はどこにも文書化されていますか?
そして最も重要なこと-オプションのBool
を実際に表現するにはどうすればよいですか?
私はいくつかの回避策を考えることができますが、それらは理想的ではないようです(例えば、スカラーを使用せず、NSNumber
のBool
表現に戻ります。 Bool
はisVerified_isSet
のようなものを呼び出しました
注:さらにいくつかのテストを行い、Default Value
がNone
またはNO
に設定されている場合、変数はfalse
として保存されます(たとえ私のコードで実際に割り当てないでください)。 Default Value
がYES
に設定されている場合、変数はtrue
として保存されます。それでも、これは、(明らかに)この変数がまだ設定されていないとして論理的に表現する方法がないことを意味します。
私は同じことを見て、それがバグだと考えています。私が見つけることができるどこにも文書化されていません。どうやら、Core DataはObjective-Cスタイルの仮定をここで適用しています。ブール値のデフォルトはNO
、整数のデフォルトは0です。CoreData/Swiftインターフェースにはいくつかの粗いエッジがあります前に検討した。
それは良い発見ですが、Appleがそれに対処するまであなたはそれで立ち往生していると思います。あなたはすでに最高の回避策を知っています。
これは、Objective-Cスカラー型にはnil値の概念がないために発生します。ソース: handling-core-data-optional-scalar-attributes
あなたがこれでここに終わる場合:
@NSManaged var boolAttribute: Bool
そして、Objective-Cでは見られません、andそれらの属性ですでに「オプション」を無効にし、「スカラータイプを使用」を有効にしている自分に好意。
Swift Objective-Cファイルへのブリッジングヘッダー)をインポートしたことを再確認してください。
私はそうしなかったし、まあ、頭を叩いて自分がどれほど愚かだったかに気付く前に、BoolsをNSNumbersに変える方法のほとんどでした。