我想在Objective C中动态转换并访问实例属性。这里有一个伪代码:
id obj;
if (condition1)
obj = (Class1*)[_fetchedResults objectAtIndex:indexPath.row];
else
obj = (Class2*)[_fetchedResults objectAtIndex:indexPath.row];
NSNumber *latitude = obj.latitude;
然后编译器告诉我以下内容: 在'__strong id'
类型的对象上找不到属性'纬度'Class1和Class2都是核心数据实体,并且具有几乎相同类型的属性。在condition1 _fetchedResults 中返回Class1类型的对象,在condition2 _fetchedResults 中返回Class2类型的对象。
有人能给我一个如何解决这类问题的提示吗?
谢谢!
答案 0 :(得分:6)
您可以通过键值编码(KVC)访问属性:
[obj valueForKey:@"latitude"]
答案 1 :(得分:3)
obj
变量必须属于具有相关属性的类型。如果两个实体具有相同的属性,则实现此目的的一种方法是在公共基类上声明属性。如果这两种类型不适合共享一个公共基类,那么你可以让他们采用一个通用协议,如下所示:
@protocol LatitudeHaving
@property (copy) NSNumber* latitude;
@end
@interface Class1 (AdoptLatitudeHaving) <LatitudeHaving>
@end
@interface Class2 (AdoptLatitudeHaving) <LatitudeHaving>
@end
从那里开始,您会将obj
声明为id<LatitutdeHaving>
,如下所示:
id<LatitudeHaving> obj;
if (condition1)
obj = (Class1*)[_fetchedResults objectAtIndex:indexPath.row];
else
obj = (Class2*)[_fetchedResults objectAtIndex:indexPath.row];
NSNumber *latitude = obj.latitude;
那应该这样做。 FWIW,协议类似于Java中的接口。