Как я могу создать класс-оболочку из двух классов модели в target-c

Я работаю над приложением, в котором у меня есть два очень похожих модельных класса. Я хочу использовать оба этих класса в одном контроллере представления, макет которого основан на свойствах классов модели. Проблема в том, что у меня сейчас много операторов 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 или что-то подобное для создания абстрактного класса, но я не знаю, как такой класс будет выглядеть, работать и использоваться.

Будем весьма благодарны за любые предложения, если это возможно, и в таком случае, как будет выглядеть такой класс-обертка.

2 ответа

Решение

Базовые данные поддерживают концепцию абстрактного суперкласса. Таким образом, вы определяете это с помощью одного свойства, скажем "tag", которое различает два класса. Тогда и News, и Event оба имеют этот класс в качестве своего суперкласса. Это очень распространенный тип решения, используемый с Core Data.

Попробуйте сделать так:

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

Другие вопросы по тегам