0

私の質問はとても簡単です。CoreDataには10の異なるエンティティがあり、すべて同じ属性(名前、説明...)があります。これらの属性にアクセスするには、次のようにします。

MyEntity *entity=...;
MyEntity2 *entity2=...;
...
MyEntity10 *entity10=...;

[self myfunction:AnEntity];

ランダムなオブジェクトを関数に送信した後

-(void)myfunction:(id)myentity

そして、ここでは、クラスMyEntityまたはMyEntity2のキングであるかどうかに関係なく、エンティティ属性にアクセスできる変数を使用したいと思います...問題は、私ができないことです。

id myobject=myentity;
NSLog(@"%@", myobject.name);

誰かがオブジェクトのクラスの種類をテストすることを避けるための解決策を持っているなら:)ありがとう!

4

2 に答える 2

2

10の異なるエンティティがある場合は、NSManagedObjectサブクラスに移動するときが来たと思います。次に、すべての共有属性を含むプロトコルを定義し、NSManagedObjectサブクラスがそのプロトコルに準拠していることを宣言できます。その後、あなたの呼び出しはなります

-(void)myfunction:(id<SharedAttributesProtocol>)myObject

{
    NSLog(@"%@", myObject.name);
}

共有属性の1つとして「説明」について言及されました。-descriptionメソッドはすでに定義されているため、その属性に別の名前を選択することをお勧めします。

共通属性に親NSEntityを使用することのこの欠点は、1つの非常に幅の広いテーブルになってしまうことです。このテーブルには、すべての共通属性がありますが、各サブエンティティのすべての個別の属性もあります。オブジェクトのサイズによっては、これはiOSでのパフォーマンスの低下になりますが、OSXではそれほどひどいものではありません。

于 2012-12-23T20:33:49.317 に答える
0

実際、あなたは呼び出すことができます

[myobject valueForKey:@"name"]

あるいは

[myobject name]

メソッドは実行時に解決されるため、関数内で。myobject「name」属性がある場合、これは機能します。そうでない場合、実行時にクラッシュします。

MyEntityよりクリーンな解決策は、共通の属性などを使用して1つの「親エンティティ」を定義することです。次に、「親エンティティ」として持つサブエンティティ、、name... を定義できます。これらのサブエンティティは、親エンティティのすべての属性/関係を継承し、追加の属性と関係を持つことができます。descriptionMyEntity1MyEntity2MyEntity

対応する管理対象オブジェクトのサブクラスは、MyEntityクラスのサブクラスになります。関数は次のようになります。

- (void)myfunction:(MyEntity *)myentity
{
     NSLog(@"%@", myentity.name);
}

そして、任意のサブクラスのインスタンスを使用して呼び出すことができます。

MyEntity1 *myentity1 = ...;
[self myfunction:myentity1];
MyEntity2 *myentity2 = ...;
[self myfunction:myentity2];
于 2012-12-23T19:45:34.300 に答える