У меня очень простой вопрос относительно некоторых решений по разработке программного обеспечения с использованием iOS SDK.
Предположим, у меня есть класс, который управляет представлением объектов вида в моем приложении (UIManager
). Этот класс позволяет классам внешних контроллеров добавлять в него объекты представления. Объекты просмотра могут быть двух видов: CALayer
и UIView
подклассы.
У меня вопрос, какой интерфейс лучше подходит для такого класса UIManager
.
Например:
@interface UIManager : UIView {}
// 1)
- (void)addGenericViewObject:(id)genericViewObject;
// 2)
- (void)addUIViewObject:(UIView*)uiViewObject;
- (void)addCALayerObject:(CALayer*)caLayerObject;
// 3)
- (void)addMyProtocolTypeViewObject(id<MyProtocolType>)myProtocolTypeViewObject;
@end
1) Тип id
слишком общий?
2) Наличие разных сигнатур методов для каждого типа может привести к ужасному дублированию кода?
3) Есть ли способ представления классов UIView
и CALayer
через <MyProtocolType>
?
Или, вообще говоря, иметь класс, который обрабатывает эти различные объекты взаимозаменяемо, нехорошо?
Реализация UIManager
будет выглядеть примерно так:
@implementation UIManager
// 1)
- (void)addGenericViewObject:(id)genericViewObject {
if ([genericViewObject isKindOfClass:[UIView class]]) {
[_uiViewsContainer addSubview:(UIView*)genericViewObject];
} else if ([genericViewObject isKindOfClass:[CALayer class]]) {
[_caLayersContainer addSublayer:(CALayer*)genericViewObject];
}
}
@end
Проверка типов всегда плоха, возможно, наличие <MyProtocolType>
решит ситуацию, однако, как я могу представить оба класса UIView
и CALayer
в протоколе? Оба класса просто соответствуют <NSObject>
.
Заранее спасибо