我经常遇到这样的设计选择,有些困难; 我正在寻求其他观点。
我经常想保留列表或传递一些状态块,这些状态块基本上只是一组值。 这些值往往是原始类型:浮点数、NSTimeIntervals、CGPoints等。
我的第一个想法通常是为这些属性集创建C结构,例如:
typedef struct _STATE {
float foo;
NSTimeInterval elapsed;
CGPoint point;
} STATE;
但是C结构体与本地Cocoa集合类(NSArray
,NSSet
,NSDictionary
)的兼容性不好,而且使用过多的结构体来跟踪大量状态感觉与我的Cocoa友好代码背道而驰——我最终会直接管理结构体数组,并在消息中传递结构体指针等。
另一方面,由于原始性能并不一定至关重要,我可以将这些值编码到NSDictionary中,将它们全部包装在NSValue
或NSNumber
中,但是结果的语法几乎不简洁,有点脆弱,需要在运行时正确输入类型和名称才能进行插入和查找:
[stateDict setObject:[NSNumber numberWithFloat:foo] forKey:@"bar"];
...
float something = [[stateDict objectForKey:@"bar"] floatValue];
有些类型,例如NSTimeInterval,只能通过一些(有争议的)技巧来使用(在这种情况下将其强制转换为double类型)。
最后,我可以创建仅包含私有成员数据和getter/setter方法的数据容器对象。(这些在Java中被称为“bean”)。与字典相比,这些对象更加简洁易用,更符合Cocoa的结构,但对于我来说感觉过于复杂,尤其是如果我只需要它们作为“内部类”,用于单个对象类型的状态管理。
各位伟大的Cocoa程序员,你们是如何做到这一点的呢?