在目标c中从id到class的动态类型转换

时间:2013-04-30 11:50:10

标签: objective-c dynamic-typing

我想在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类型的对象。

有人能给我一个如何解决这类问题的提示吗?

谢谢!

2 个答案:

答案 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中的接口。