2012-08-04 70 views
2

我正在开发一个应用程序,其中有两个非常相似的模型类。我想在一个视图控制器中使用这两个类,该布局基于模型类的属性。问题是我目前有很多if语句来检查它是哪个类。如何创建两个模型类的包装类在objective-c

例子:

- (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或类似的东西来创建一个抽象类,但是我不知道这样的类会如何工作和使用。

任何建议,如果这是可能的,在这种情况下这样的包装类会看起来将不胜感激。

+0

'如果([对象​​类别] == [事件类])'是危险的,请使用'[object isKindOfClass:[Event class]]'代替。 – 2012-08-04 13:17:45

回答

1

核心数据支持抽象超类的概念。所以你用一个属性来定义它,比如说“标签”,它可以区分这两个类。然后,新闻和事件都将该类作为他们的超类。这是Core Data使用的一种非常常见的解决方案。

+0

谢谢,抽象超类应该拥有所有的共性还是只有一个? – Anders 2012-08-05 12:08:27

+0

您可以添加所需的所有常用属性。我们使用这种技术,就像您在教科书中读到的一样 - “动物”基类,然后是特定的子类等等。然后你可以在设置一个属性之前总是用抽象超类来测试一个对象“isKindOfClass:”。 – 2012-08-05 13:24:05

+0

很酷,如何使用if语句在我的原始问题中发布代码示例。我可以做@ bogdan-andresyuk在他的回答中写道,还是会以不同的方式工作?我现在的清洁工的模型非常棒!但如果我不需要所有这些if语句,它会更好。谢谢! – Anders 2012-08-05 15:27:17

1

尝试这样做:

//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声明

+0

这并不理想。它保留了“switch语句/如果逻辑是多态性”反模式,通常意味着多态性将是更好的解决方案。 – occulus 2012-08-04 14:12:24

+0

如果模型非常相似(如主题中所述)并且Anders不使用类特定的方法和变量,这是一个理想的解决方案。 – 2012-08-04 14:57:21

+0

谢谢,很难选择谁给出正确的答案。你的建议也非常接近我最后提出的建议。 – Anders 2012-08-06 08:58:47