gpt4 book ai didi

iphone - UIView/CALayer的通用类/协议(protocol)-软件设计问题

转载 作者:行者123 更新时间:2023-12-03 19:22:27 28 4
gpt4 key购买 nike

我有一个关于使用 iOS SDK 的一些软件设计决策的非常简单的问题。

假设我有一个类来管理应用程序中 View 对象的呈现( UIManager )。此类允许外部 Controller 类向其添加 View 对象。 View 对象可以有两种:CALayerUIView子类。

我的问题是哪个界面更适合这样的UIManager类(class)。例如:

@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) 有没有办法同时表示 UIViewCALayer上课经过<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>可以解决这个问题,但是,我如何才能同时代表UIViewCALayer协议(protocol)中的类?两个类都符合<NSObject> .

提前致谢

最佳答案

类型检查非常必要。我认为可以将问题重新构造为……“我希望经理采用 UIView 或 CALayer 并对它们做不同的事情,但拒绝所有其他事情。”在这种情况下,类型检查胜过黑客攻击,我衷心建议您只进行类型检查,并在事情未按预期进行时抛出异常。

可以向 CALayer 和 UIView 添加一个非常非常私有(private)的私有(private)类别,例如具有 64 个字符的随机标识符的私有(private)类别,这使类符合自定义协议(protocol),并且只需检查一致性。但这与类型检查的作用相同,并且是大量(不必要的)工作;我上次尝试时,GCC 似乎讨厌这样做。

我认为如果以后你要处理很多类,这可能会起作用:

- (BOOL) addInterfaceObject:(id)anObject {

void (^handler)();

if (!(handler = [self interfaceObjectHandlerForClass:[anObject class]]))
return NO; // Or throw an exception

handler(anObject);
return YES;

}

- (void(^)(id anObject)) interfaceObjectHandlerForClass:(Class)aClass {

// Or retrieve copy-autoreleased blocks from a dictionary

if ([aClass isSubclassOfClass:[UIView class]])
return ^ (id anObject) { [self.view addSubview:(UIView *)anObject]; };

if ([aClass isSubclassOfClass:[CALayer class]])
return ^ (id anObject) { [self.view.layer addSublayer:(CALayer *)anObject]; };

return nil;

}

关于iphone - UIView/CALayer的通用类/协议(protocol)-软件设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5182628/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com