我的问题非常简单。我在CoreData中有10个不同的实体,都有相同的属性(名称,描述......)。要以这种方式访问这些属性:
MyEntity *entity=...;
MyEntity2 *entity2=...;
...
MyEntity10 *entity10=...;
[self myfunction:AnEntity];
将随机对象发送到函数
之后-(void)myfunction:(id)myentity
在这里我想使用一个可以访问实体属性的变量,无论它是MyEntity类还是MyEntity2的国王......问题是我做不到:
id myobject=myentity;
NSLog(@"%@", myobject.name);
如果有人有解决方案,以避免测试对象的类:) 谢谢!
答案 0 :(得分:2)
如果您有10个不同的实体,我认为是时候转移到NSManagedObject子类了。然后,您可以定义包含所有共享属性的协议,并声明NSManagedObject子类符合该协议。然后你的电话就变成了
-(void)myfunction:(id<SharedAttributesProtocol>)myObject
{
NSLog(@"%@", myObject.name);
}
您提到“description”是您的共享属性之一。 -description方法已经定义,因此您可能希望为该属性选择其他名称。
使用父NSEntity作为公共属性的这个缺点是你最终得到一个非常宽的表。此表具有所有常用属性,但也包含每个子实体的所有不同属性。根据您的对象的大小,这将是iOS下的性能影响,尽管它在OS X上并不那么糟糕。
答案 1 :(得分:0)
实际上你可以调用
[myobject valueForKey:@"name"]
甚至
[myobject name]
在您的函数中,因为这些方法是在运行时解析的。如果myobject
具有“name”属性,则这将起作用,否则它将在运行时崩溃。
更清洁的解决方案是使用公共属性MyEntity
,name
等定义一个“父实体”description
。然后,您可以定义子实体MyEntity1
,{{ 1}},...将MyEntity2
作为“父实体”。这些子实体继承父实体的所有属性/关系,并且可以具有其他属性和关系。
相应的托管对象子类是MyEntity
类的子类。你的功能可能如下所示:
MyEntity
您可以使用任何子类的实例调用它:
- (void)myfunction:(MyEntity *)myentity
{
NSLog(@"%@", myentity.name);
}