我刚刚建立了一个简单的Core Data数据库,我创建了一些具有一些属性的实体。但是,某些实体具有一些共同的属性,例如Date参数。到现在为止我做了类似的事情:
NSManagedObject * passedObject...
if ([_passedObject.entity.name isEqual:@"Archive"]){
Archive* fileObject = (Archive *)_passedObject;
myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:fileObject.fileData];
}else{
AllFiles* fileObject = (AllFiles *)_passedObject;
myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:fileObject.fileData];
}
fileData对两者都是通用的,所以我只想做passObject.fileData而不是转换类型。可以这样做吗?
答案 0 :(得分:2)
定义协议......
@protocol FileDataProvider
@property (strong,nonatomic) NSData* fileData;
//or -(NSData *)fileData; would be suitable for RO access
@end
并使您的对象符合该协议
@interface Archive:NSManagedObject< FileDataProvider >
@property (strong,nonatomic) NSData* fileData;
@end
@interface AllFiles:NSManagedObject< FileDataProvider >
@property (strong,nonatomic) NSData* fileData;
@end
因此你可以这样投射
myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:((id<FileDataProvider>)passedObject).fileData];
或更安全
if([passedObject conformsToProtocol:@protocol(FileDataProvider)]) {
myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:((id<FileDataProvider>)passedObject).fileData];
}