Как я могу создать класс-оболочку из двух классов модели в 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