2016-08-19 10 views
2

私は全部Swift/IOS初心者です。私が理解できないCoreDataについては何かがあります。Swift:NSManagedObjectから継承すると、なぜプロパティが失われますか?

私は、指定された初期化子で初期化されるいくつかの非オプションのプロパティを持つクラスを持っています。私はNSManagedObjectを継承し、そのクラスを設定した場合はその後、その後、突然、私はエラーを取得する

Stored property X requires an initial value or should be @NSManaged. 

はなぜスウィフトは突然、彼らは明らかにされているにもかかわらず、私のプロパティが初期化されていないと思うのですか?

また、@ NSManagedは、プロパティの格納と実装がCoreDataによって処理されることをコンパイラに伝えますが、それはどういう意味ですか?

すべての回答をいただければ幸いです。

+0

コアデータスタックとモデルの他の部分は追加しましたか?なぜこのクラスを管理オブジェクトにしたいのですか? – Wain

答えて

2

私は実際にこの昨日について読んでいました。

はい、実際は@dynamicのように機能します - 技術的には でも同じです。意味的にわずかな違いがあります。

@dynamicは 'コンパイラは、自分のプロパティも であるかどうかをチェックしません。そこあなたが見ることができる何のコードもないが、私はそれ は、実行時に動作することを保証するコンパイラ「を今@NSManaged

氏は述べています」、私は実装の世話をするために コアデータを持っているとして、これらのプロパティをチェックしていないかもしれない - それがされます@NSManagedはダイナミックのより 狭いバージョンである糖衣構文です:)

この question

から取ら

:ので、あなたも言うことができる ランタイム」

でがあります

このように、コンパイル時にプロパティが実装されているかどうかを確認するなど、言語を非常に安全にすることが急務でした。私が正しく理解していれば、CoreDataはこれらのコンパイル時間チェックにはあまり適合しないので、@NSManagedを追加すると、変数が処理されることをコンパイラに知らせることができます。 Appleから

あなたは コアデータが 実行時に宣言のストレージおよびインプリメンテーションを提供しスウィフトコンパイラに知らせるために@NSManaged属性を使用します。

+0

私は長いコメントを書いたが、それを削除しました。これらの小さなSwiftの奇妙なことはゆっくりと沈んでいます。つまり、NSManagedObjectはサブクラスがプロパティが本当にサブクラスに実装されているかどうかを判断できません。それは、この警告を引き起こすのはプロパティが実装されていることを考慮すると、奇妙で​​す。これらのプロパティを@NSManagedに設定します。それ以外に何が必要ですか?彼の全体の出来事はナンセンスであり、そのプロパティは実際には実装されていると考えて、どのように「実行時にこれらのプロパティを実装するのですか? :-) – user884248

+0

私はそれが迅速なコンパイラがオプションを扱う方法と関係していると思います。Swiftは型安全な言語であり、CoreDataスタックは技術的に型が安全ではないobj-c内にありますが、@ NSManagedはその2つの世界を橋渡しする方法です。これは私の理解ですが、自分よりも賢い人からの検証が大好きです。 – random

+0

あなたは実装の誤解があるかもしれないと思います。宣言された変数が実装されているとは限りません。スウィフトコンパイラが変数を調べるとき、それはオプションでもセットでもなければならない。 2人のうちの1人。 'NSMangedObject'サブクラスは、タイプセーフではないobj-cベースから継承しているので、そのままの状態でその能力を持ちません。 @ NSManaged属性を使用して、コアデータが実行時に宣言の格納と実装を提供することをSwiftコンパイラに通知します。 @ user884248助けて欲しい! – random

関連する問題