web-dev-qa-db-ja.com

@NSManagedは何をしますか?

私はさまざまな場面でこのキーワードに遭遇しました。私はそれが何をすべきかを知っています。しかし、私は本当にそれをより良く理解したいと思っています。

@NSManagedについて気づいたこと-ドキュメントではなく、繰り返し使用して

  1. キー値コーディングを魔法のように置き換えます。
  2. Objective-Cの@dynamicとほぼ同等です(これについてはあまり知りません)。
  3. Parse SDKからPFObjectをサブクラス化する必要があります。通常、KVCを使用して、バックエンドとの間で値を読み書きします。
  4. イニシャライザ内で初期化しないと、変数に@NSManagedというプレフィックスを付けるとコンパイラがシャットダウンします。

正式な定義(コアデータ内Apple Docs):

コアデータは、NSManagedObjectクラスのサブクラスのプロパティの基礎となるストレージと実装を提供します。 Core Dataモデルの属性または関係に対応する管理対象オブジェクトサブクラスの各プロパティ定義の前に@NSManaged属性を追加します。 Objective-Cの@dynamic属性と同様に、@ NSManaged属性はSwiftコンパイラーにプロパティの格納と実装が実行時に提供されることを通知します。ただし、@ dynamicとは異なり、@ NSManaged属性はコアデータサポートでのみ使用可能です。

私はそれから得たもの:

@NSManagedを含む変数は、 something のコンパイル時チェックから除外されます。

私は正式なドキュメントと他のさまざまなSOこの問題に関する質問を読みました:

@ synthesize vs @dynamic、違いは何ですか?

@ dynamicの使用法の一般的なケースは何ですか?

some 使用すべきシナリオを本能的に認識しています。私は部分的にそれが何をするか知っています。しかし、私が求めているのは、それが何をするのかについてのより純粋な理解です。

さらなる観察:

Parse SDKPFObjectは、その値にアクセスするためにKey Value Codingに依存しています。 PFObjectは、次のアクセサーを提供します。

objectForKey:

let score = results.objectForKey("descriptionOfResult") 
//returns the descriptionOfResult value from the results object

setObject:forKey:

results.setObject("The results for a physics exam", forKey: "descriptionOfResult") 
//sets the value of descriptionOfResult 

私の理解では、@NSManaged magically は、宣言した変数がgetおよびsetへの上記のアクセサーを自動的に使用することを理解しています。私はそれがどのようにそれを行うのか(私が理解していることが真実であれば)、そしてそれが他に何でもすることを知りたいです。

36
Kelvin Lau

はい、実際には@dynamicのように動作します-技術的には同じかもしれません。意味的にはわずかな違いがあります:

@dynamicは、「コンパイラ、プロパティも実装されているかどうかを確認しないでください」と表示します。あなたが見ることができるコードはないかもしれませんが、実行時に動作することを保証します」

@NSManagedは、「コンパイラ、実装を処理するコアデータがあるので、これらのプロパティをチェックしないでください-実行時に存在します」と言います。

@NSManagedは、より狭いバージョンのdynamicである構文糖です:)


https://github.com/KyoheiG3/DynamicBlurView/issues/2
ここで、誰かが@dynamicの動作を望んでいたので、CDなしで@NSManagedを使用しました。

36
Daij-Djan

Apple docs では、カスタム管理オブジェクトクラスの場合、プロパティの例を引用しています... enter image description here 私には違いはないようだ、私は@dynamic Objective Cでは、@NSManagedはSwiftの代替品です。

3
BangOperator

上記の答えは正しいです。これが私の理解です。

@NSManagedは、アプリの実行時に変数が値を取得することを示します。 Coredataは、そのような小道具のゲッターとセッターを自動的に作成します。警告のためにコンパイラを黙らせます。

NSmanagedはNSObjectのサブクラスです。 @NSManagedは、実行時にこれらの小道具に追加のコードが与えられることを意味します。これらのプロパティに加えられた変更を追跡します。

0
iPhoneDeveloper