2016-06-23 11 views
2

RLMArrayを宣言するとき、2番目の括弧の意味は何ですか?レルムは私がこれが使用されているのを見た唯一の場所です。RLMArrayプロパティ宣言の構文

@property NSArray<NSDictionary*> *dictionaries; // I understand this (and it's wonderful!) 
@property NSDictionary<NSString*, NSArray<NSString*>*> *dictionaryOfArraysOfStrings; // No problem with this either 
@property RLMArray<Object*><Object> *objects; // What is <Object> for? 

答えて

5

山括弧の2つのセットは、それぞれObjective-Cジェネリックとプロトコルのためのものです。 Objective-Cジェネリックスを使用すると、可能なRLMObjectサブクラスではなく、-[RLMArray firstObject]のようなメソッドが配列に含まれるオブジェクトの特定の型を返すことがコンパイラに通知されます。残念ながら、この余分な型情報は実行時に消去されるため、RealmはObjective-Cジェネリックの単独の使用から、プロパティ宣言で配列に含まれるオブジェクトの型を知らせる方法がありません。これはプロトコル準拠が行われる場所です。プロパティがに準拠するプロトコルは、実行時にRealmが利用できるです。したがって、RLMArrayプロパティに含まれるオブジェクトタイプをRealmに通知するために使用されます。 Realm provides the RLM_ARRAY_TYPE macroは、モデルクラスと同じ名前のプロトコルを宣言するため、プロトコルが関係していることは間違いありません。

+0

bdash、ありがとうございます。クラスと同じ名前で宣言されているプロトコルについても疑問に思っていました。私はrealmソースの 'conformsToProtocol'を検索しましたが、このプロトコルがどのように使われているかは分かりませんでした。理論的には、私がした場合: '@property(非原子)NSArray *> *配列; @プロパティ(nonatomic)NSArray * array2; '再び何が配列を取得します。 array2とは何が違うのですか? 1-2行の例を教えてください。 – arsenius

+0

説明した方法でのプロトコルの使用は、 'RLMObject'のサブクラス上のタイプ' RLMArray'のプロパティに特有です。あなたが言及する2つのケースは、異なるもののプロトコル適合性を必要とします。 '配列'の場合、配列に含まれる 'UIViewController'はプロトコルに準拠しなければなりません。 'array2'の場合、配列自体はプロトコルに従わなければなりません。後者は、あなたが後にしているものである可能性は低いです。 – bdash

+1

bdash、私はついにそれを手に入れました!角かっこが横になって私を捨てましたが、これは文字通り文字通り一般的なものであり、同時にプロトコルであることは明らかです。頭の上で私を打ち続けると私はそこに着くでしょう...ありがとう! – arsenius

関連する問題