我需要存储和传递几个配对对象:
1)NSString
一个文件名,例如“sprite.png”
2)BOOL
该精灵是否应该被动画化的值。
所以基本上,我有一堆精灵,每个精灵要么是动画的,要么没有。
我以为我可以使用 anNSDictionary
来存储所有内容,但我认为使用[NSNumber numberWithBool:YES]
as 键只允许您拥有一个具有该值的条目。
什么样的结构最适合传递以满足我的要求?
我需要存储和传递几个配对对象:
1)NSString
一个文件名,例如“sprite.png”
2)BOOL
该精灵是否应该被动画化的值。
所以基本上,我有一堆精灵,每个精灵要么是动画的,要么没有。
我以为我可以使用 anNSDictionary
来存储所有内容,但我认为使用[NSNumber numberWithBool:YES]
as 键只允许您拥有一个具有该值的条目。
什么样的结构最适合传递以满足我的要求?
由于 Objective-C 是 C 的严格超集,因此您可以使用 C struct。例如:
struct sSpriteDef
{
BOOL isAnimated;
NSString *name;
};
typedef struct sSpriteDef SpriteDef;
上课:
@interface SpriteTuple : NSObject
@property (assign) BOOL shouldAnimate;
@property (copy) NSString *filename;
@end
@implementation
@synthesize shouldAnimate, filename;
@end
你完成了。一个更动态但不那么惯用的方式是使用单独的哈希:
static NSString *image = @"ImageFileKey";
static NSString *shouldAnimate = @"ShouldAnimateKey";
@{ image: @"path/to/image.png"; shouldAnimate: @(YES) };
@{ image: @"path/to/secondimage.png"; shouldAnimate: @(NO) };
// ...
这就是来自 Python 或 Ruby 的人可能会这样做的方式......
如果我理解正确,您需要的是一种表示元组的方式,您可以使用它来关联一组相关值并作为参数一起传递给方法,设置为对象的属性等。我遇到了这个在我自己的发展中被无数次质疑。早期,我会使用 NSArray。所以在你的情况下,我会说:
NSArray *spriteTuple = [NSArray arrayWithObjects:someSpriteImageName,someBoolNSNumber,nil];
并解压为:
NSString *name = [spriteTuple objectAtIndex:0];
BOOL animated = [[spriteTuple objectAtIndex:1] boolValue];
然而,随着时间的推移,总是会发生元素的数量会随着项目的发展而增加,所以从一对开始的会变成三胞胎、四胞胎……然后上面的代码很容易出现重新排序的错误.
iLuvCapra 在我打字时提供的答案就是我现在一直在做的事情。只需创建一个从 NSObject 派生的新类并将参数设为其属性。干净且可扩展。
我想你在说的是:我有一个带有键@“spriteName”的精灵映射到一个值[NSNumber numberWithBool]。
你打算用这个容器做什么?喜欢:它会持有一个大数还是小数?(如果它像小于十,一个数组,哈希,树,我们可以说是不相关的短期)大数或未知那么重要的是你会是什么用它做的最多?- 添加和删除很多“NSSet” - 通过一个可比较的键“NSDictionary”查找很多个别的东西 - 遍历整个列表很多“NSArray”等......
等等......这些是您在选择容器之前需要问的问题。Apple 资源网站上有一个面向开发人员的容器编程指南,它或多或少地列出了哪个容器适用于什么。