如何在objective-c中创建两个模型类的包装器类
我正在开发一个应用程序,我有两个非常相似的模型类。我想在一个视图控制器中使用这两个类,该视图控制器的布局基于模型类的属性。问题是我现在有很多if语句来检查它是哪个类 例如:如何在objective-c中创建两个模型类的包装器类,objective-c,ios,core-data,nsmanagedobject,Objective C,Ios,Core Data,Nsmanagedobject,我正在开发一个应用程序,我有两个非常相似的模型类。我想在一个视图控制器中使用这两个类,该视图控制器的布局基于模型类的属性。问题是我现在有很多if语句来检查它是哪个类 例如: - (UIView *)setUpViewForObject:(id)object { // Check if it is a Post or Event object Post *post; Event *event; if ([object class] == [Event class]
- (UIView *)setUpViewForObject:(id)object
{
// Check if it is a Post or Event object
Post *post;
Event *event;
if ([object class] == [Event class]) {
event = (id)object;
} else if ([object class] == [Post class]) {
post = (id)object;
}
if (post) {
// Do stuff
// ie:
self.customUiView.textField.text = post.text;
} else if (event) {
// Do similar stuff
// ie:
self.customUiView.textField.text = event.text;
}
}
这个解决方案看起来很多余,我在几个地方做过。因此,我想知道是否有可能创建一个包含两个NSManagedObject类的包装类。我使用CoreData并从xCode生成模型,所以我不会使用所有这些if语句
比如:
@interface News : NSManagedObject
[...]
@property (nonatomic, retain) NSString * text;
[...]
@interface Event : NSManagedObject
[...]
@property (nonatomic, retain) NSString * text;
[...]
是否可以使用枚举创建这两个NSManagedObject类的包装类。我还希望对象是可更新的、可删除的等等。我在想我可能可以使用Enum或类似的东西来创建一个抽象类,但我不知道这样的类会是什么样子、如何工作和如何使用
如果这是可能的,并且在这种情况下像这样的包装类看起来如何,任何建议都将非常感谢 核心数据支持抽象超类的概念。所以你用一个属性来定义它,比如“tag”,它区分了这两个类。然后,新闻和事件都将该类作为其超类。这是用于核心数据的一种非常常见的解决方案。请尝试以下方法:
//in NewsEventRootObject.h
@interface NewsEventRootObject:NSManagedObject //root object for these two classes
[...]
@property (nonatomic,retain) NSString *text; //similar fields in here
-(void) getSomeValue;
//in News.h
@interface News : NewsEventRootObject
[...]
-(void) getNews;
//in Event.h
@interface Event : NewsEventRootObject
[...]
-(void) getEvent;
//in your "handler".m
- (UIView *)setUpViewForObject:(NewsEventRootObject *) object
{
//you can access similar fields and methods without if/else statements
self.customUiView.textField.text = object.text;
SomeValue *someValue=[object getSomeValue];
//but for class-specific you should make a check
if ([object respondsToSelector:@selector(getEvent)]) {
}
if ([object respondsToSelector:@selector(getNews)]) {
}
}
实际上,永远不要通过==,使用isKindOfClass语句检查类
如果([object class]==[Event class])
是危险的,请改用[object isKindOfClass:[Event class]]]
。这并不理想。它保留了“switch statement/if logic as polymorphics”反模式,这通常意味着多态性将是一个更好的解决方案。如果模型非常相似(如主题中所述),并且Anders不会使用特定于类的方法和变量,这是一个理想的解决方案。谢谢,很难选择给出正确答案的人。你的建议与我最后的建议非常接近。谢谢,抽象超类应该具有所有公共属性还是只有一个?你可以添加所有想要的公共属性。我们使用了这项技术,就像你在教科书中读到的一样——一个“动物”基类,然后是专门的子类等等。效果非常好!然后,您可以在设置属性之前使用抽象超类测试对象“isKindOfClass:”。很酷,这将如何处理我在原始问题中发布的代码示例以及if语句。我能像@bogdan andresyuk在他的回答中写的那样做吗,或者这会有不同的效果吗?我的模型现在更干净了,太棒了!但如果我不需要所有这些if语句,那就更好了。谢谢是-但是向根添加一个新字段,如“tag”,并将其设置为整数,然后使用#defines将其设置为不同类的不同数字。然后,您可以在“标记”值上进行测试,这可能比在类上进行测试更容易键入。最后,这是同样的逻辑测试,只是我建议的(IMHO)更容易输入。