0

我的问题很简单。我在 CoreData 中有 10 个不同的实体,它们都具有相同的属性(名称、描述......)。要以这种方式访问​​这些属性:

MyEntity *entity=...;
MyEntity2 *entity2=...;
...
MyEntity10 *entity10=...;

[self myfunction:AnEntity];

在我将随机对象发送到函数之后

-(void)myfunction:(id)myentity

在这里,我想使用一个可以访问实体属性的变量,无论它是 MyEntity 还是 MyEntity2 的王...问题是我做不到:

id myobject=myentity;
NSLog(@"%@", myobject.name);

如果有人有解决方案来避免测试对象的类:) 谢谢!

4

2 回答 2

2

如果你有 10 个不同的实体,我认为是时候转移到 NSManagedObject 子类了。然后您可以定义一个包含所有共享属性的协议,并声明您的 NSManagedObject 子类符合该协议。然后你的电话变成

-(void)myfunction:(id<SharedAttributesProtocol>)myObject

{
    NSLog(@"%@", myObject.name);
}

您提到“描述”作为您的共享属性之一。-description 方法已定义,因此您可能希望为该属性选择另一个名称。

将父 NSEntity 用于公共属性的缺点是您最终会得到一个非常宽的表。该表具有所有公共属性,但也具有每个子实体的所有不同属性。根据对象的大小,这将在 iOS 下对性能造成影响,尽管在 OS X 上并没有那么糟糕。

于 2012-12-23T20:33:49.317 回答
0

事实上你可以打电话

[myobject valueForKey:@"name"]

甚至

[myobject name]

在您的函数中,因为这些方法是在运行时解析的。如果myobject有一个“名称”属性,这将起作用,否则它将在运行时崩溃。

一个更简洁的解决方案是定义一个MyEntity具有公共属性的name“ 父实体”description等。然后您可以定义子实体MyEntity1MyEntity2...,MyEntity作为“父实体”。这些子实体继承父实体的所有属性/关系,并且可以具有额外的属性和关系。

相应的受管对象子类是该类的子MyEntity类。您的函数可能如下所示:

- (void)myfunction:(MyEntity *)myentity
{
     NSLog(@"%@", myentity.name);
}

您可以使用任何子类的实例调用它:

MyEntity1 *myentity1 = ...;
[self myfunction:myentity1];
MyEntity2 *myentity2 = ...;
[self myfunction:myentity2];
于 2012-12-23T19:45:34.300 回答