7

我想在 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 都是核心数据实体,具有几乎相同的属性。在条件1 中, _fetchedResults返回Class1 类型的对象,在条件2 中, _fetchedResults返回 Class2 类型的对象。

有人可以给我一个提示如何解决这种问题吗?

谢谢!

4

2 回答 2

6

您可以通过键值编码 (KVC) 访问属性:

[obj valueForKey:@"latitude"]
于 2013-04-30T12:13:15.900 回答
3

obj变量必须是具有相关属性的类型。如果两个实体具有相同的属性,实现此目的的一种方法是在公共基类上声明该属性。如果这两种类型不适合共享一个公共基类,那么您可以让它们采用一个公共协议,如下所示:

@protocol LatitudeHaving
@property (copy) NSNumber* latitude;
@end

@interface Class1 (AdoptLatitudeHaving) <LatitudeHaving>
@end

@interface Class2 (AdoptLatitudeHaving) <LatitudeHaving>
@end

从那里,您将声明objid<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 中的接口。

于 2013-04-30T12:13:45.530 回答