1

NSManagedObjectと呼ばれるサブクラスがあるとMBManagedSquareMBManagedCircleます。MBManagedSquareMBManagedCircleメソッドを定義し、prepareFromDictionary:(NSDictionary*)dic両方の実装が異なります。

このコードがあるとします:

NSString *type = // could be @"MBManagedSquare" or @"MBManagedCircle"
NSEntityDescription *desc = [NSEntityDescription entityForName:type inManagedObjectContext:_context];
NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:desc insertIntoManagedObjectContext:_context];

そのため、Core Data でのエンティティのタイプは、type文字列を介して動的に決定されます。だから私が知っているのは、それがNSManagedObject.

私がやりたいことはprepareFromDictionary:、適切なクラスのメソッドを呼び出すことです。

したがって、タイプが「MBManagedSquare」の場合、オブジェクトを にキャストしてからMBManagedSquare呼び出したい

[castedObject prepareFromDictionary:dic];

私が試したことは次のとおりです。

Class class = NSClassFromString(type);
class *castedObject = (class*)object;

しかし、予想される式エラーが発生します。これが可能かどうかはわかりません。どうすればいいですか?

4

2 に答える 2

2

セレクターとそのパラメーターが一致する場合は、適切なクラスを呼び出すことを心配する必要はありません。ObjCには十分な動的ディスパッチ機能があります。

実装に関しては、次のいずれかにかなり一般的です。

  • 必要なインターフェースで共通ベースを作成します
  • または、両方のクラスが採用するプロトコルを作成します。

MONProtocol.h

@protocol MONManagedShapeProtocol < NSObject >
- (void)prepareFromDictionary:(NSDictionary *)pDictionary;
@end

次に(2つのタイプのいずれかであることがわかっているため、MBManagedSquareまたはMBManagedCircle)ベースから派生するか、プロトコルを採用して、次のように変数を宣言します。

// if subclass
MBManagedShape * castedObject = (MBManagedShape*)object;

また

// if protocol
NSManagedObject<MONManagedShapeProtocol>* castedObject =
                        (NSManagedObject <MONManagedShapeProtocol>*)object;
于 2012-11-12T06:51:49.433 に答える
0

そこにキャストする必要はありません。オブジェクトは or のいずれかであり、関数は一度だけ存在します。それが良いかどうかを確認する: RespondsToSelector:@selector(prepareFromDictionary:)

于 2012-11-12T07:01:14.157 に答える