2

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

例子:

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

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

4

2 回答 2

1

Core Data 支持抽象超类的概念。所以你用一个属性来定义它,比如“标签”,它可以区分这两个类。然后 News 和 Event 都将该类作为它们的超类。这是与 Core Data 一起使用的一种非常常见的解决方案。

于 2012-08-04T13:39:08.877 回答
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 语句

于 2012-08-04T13:39:28.507 回答