web-dev-qa-db-ja.com

Swiftでコアデータのオプションのスカラー(Bool / Int / Double / Float)を表す方法は?

(最初に気づいたのは:Xcode 8.2.1、iOS 10、Swift 3)(Xcode 9ベータ3、iOS11、Swift 4)の時点でまだ存在

Core Dataoptionalsの概念が先行し、Swiftoptionalsの概念に厳密に結び付けられていないことは誰もが知っています。

また、Core Data属性がNon-optionalとしてマークされている場合でも、自動生成されたNSManagedObjectサブクラスにはoptionalタイプがあります。

(一部の人は手動で?を削除しますが、悪影響はありませんが、一部は削除しませんが、それは重要です)

(ここから例とスクリーンショットはBoolプロパティ用ですが、Int16/32/64DoubleFloatについても同様です)

今、私はその逆に気づきました-タイプBoolCore Data属性がOptionalとしてマークされているとき(そしてUse Scalar Typeが選択され、Xcodeはデフォルトで行います)、自動生成されたクラスには、non-optional型の変数があります。

これは理にかなっていますか?バグですか?動作はどこにも文書化されていますか?

そして最も重要なこと-オプションのBoolを実際に表現するにはどうすればよいですか?

私はいくつかの回避策を考えることができますが、それらは理想的ではないようです(例えば、スカラーを使用せず、NSNumberBool表現に戻ります。 BoolisVerified_isSetのようなものを呼び出しました


注:さらにいくつかのテストを行い、Default ValueNoneまたはNOに設定されている場合、変数はfalseとして保存されます(たとえ私のコードで実際に割り当てないでください)。 Default ValueYESに設定されている場合、変数はtrueとして保存されます。それでも、これは、(明らかに)この変数がまだ設定されていないとして論理的に表現する方法がないことを意味します。

32

私は同じことを見て、それがバグだと考えています。私が見つけることができるどこにも文書化されていません。どうやら、Core DataはObjective-Cスタイルの仮定をここで適用しています。ブール値のデフォルトはNO、整数のデフォルトは0です。CoreData/Swiftインターフェースにはいくつかの粗いエッジがあります前に検討した。

それは良い発見ですが、Appleがそれに対処するまであなたはそれで立ち往生していると思います。あなたはすでに最高の回避策を知っています。

19
Tom Harrington

これは、Objective-Cスカラー型にはnil値の概念がないために発生します。ソース: handling-core-data-optional-scalar-attributes

9
Arek

あなたがこれでここに終わる場合:

@NSManaged var boolAttribute: Bool

そして、Objective-Cでは見られません、andそれらの属性ですでに「オプション」を無効にし、「スカラータイプを使用」を有効にしている自分に好意。

Swift Objective-Cファイルへのブリッジングヘッダー)をインポートしたことを再確認してください。

私はそうしなかったし、まあ、頭を叩いて自分がどれほど愚かだったかに気付く前に、BoolsをNSNumbersに変える方法のほとんどでした。

0
future-adam