如何避免在编写漂亮代码的同时扩展 NSArray 和思考 Java



我要做两件被认为是糟糕风格的事情,但我有理由,而且我对可可解决方案持开放态度,我只是不知道它是什么。

我想要一个对UIView类型安全的NSArray,然后是一个对 UIView 的数组类型安全的NSArrayUIViews的 2D 数组。

我想要这个,因为我已经实现了一个自定义双UITableView,它在垂直表视图中有一个嵌套的水平表视图。我会使用我的自定义ViewsArrayViews2DArray作为数据结构,其他程序员可以轻松地为我的DoubleTableView提供内容。这是想要延长NSArray的充分理由吗?

我遇到的问题是我已经覆盖了该方法的功能:

(NSArray *) initWithObjects:(id) firstObject ...为:

(ViewsArray *) initWithViews: (UIView *) firstView, ...

但是我的方法的返回值是一个NSArray,它没有包含在我ViewsArray中的其他方法,这意味着无法识别的选定异常。我通过创建一个包含我的观点的 ViewsArrayNSArray 属性暂时解决了这个问题,但是当我想将我的内容馈送到我的DoubleTableView时,这会导致代码变得丑陋。

前任:

[[self.delegate content].arraysOfViews objectAtIndex:indexPath.section];

而不是

[[self.delegate content] objectAtIndex:indexPath.section];

我知道这是几个字母,但我正在尽力写出好的代码。

如何在initWithViews中返回self,并拥有NSArray我添加的属性greatestHeighttotalWidth等?(选角?我是否在想错了(使用 Java/typeafity ...(?对于这样的数据结构,最佳解决方案是什么?

编辑:

为了以我认为"时尚"的方式解决我的问题,我做了以下工作:

这是我的标头(请注意,这是一个 NSObject(:

@interface ViewsArray : NSObject
@property int greatestHeight;
@property int greatestWidth;
@property int totalWidth;
- (ViewsArray *) initWithViews: (UIView *) firstView, ...;
- (UIView *) getViewAtIndex: (NSInteger) index;
- (NSUInteger) viewCount;
@end

这是我的实现:

@interface ViewsArray ()
@property (retain, nonatomic) NSArray *views;
@end

这意味着我只是管理一个私人的NSArray。允许漂亮的参考。

我今天学到的:阅读该死的文档并接受您的语言。我知道这个实例可能不会显示最后一个,但我更接近;)

简单的解决方案; 不要打扰

在使用和调试 Objective-C 应用程序使用 NSArray/NSDictionary API 18 年的过程中,我想我只遇到过几次错误的集合类问题。 在所有情况下,它都表明了一个总体设计问题,而不是编程错误。

简而言之,你的应用控制集合的内容,

除非你在集合中粘贴错误的内容,否则你的集合将完全包含你期望的内容。 在编写良好的应用程序中,可能向集合添加某些内容的位置数量应该非常少,通常只有一个或两个位置。

如果您确实觉得有必要对此进行防御,请在向数组中添加内容的一个或两个位置添加一个NSAssert([... isKindOfClass:...])。 无需在检索点添加相同的内容。

但是,有一种常见的误报失败模式,该模式在集合中显示为不正确的类型。 如果您过度释放了一个对象,并且恰好在同一位置分配了某个其他类的对象,那么您会看到此模式的失败。

最新更新