0

我有这样的指示:

[self someMethod:CGPointMake(50, 50)];
[self someMethod:CGPointMake(270, 50)];
[self someMethod:CGPointMake(50, 360)];
[self someMethod:CGPointMake(270, 360)];
...

我想像这样使用 NSArray 重构代码:

NSArray items = [NSArray initWithObjects:
                  CGPointMake(50, 50),
                  CGPointMake(270, 50),
                  CGPointMake(50, 360),
                  CGPointMake(270, 360),
                  ...
                  nil];

我不知道正确的语法,有人可以帮助我吗?我试过了,但 XCode 告诉我“选择器元素类型 CGPoint 不是有效对象”:

CGPoint point = [CGPoint alloc];

for (point in items) {
    [self someMethod:point];
}
4

2 回答 2

5

for-in循环是用于迭代集合类(符合 NSEnumeration)的 Objective-C 概念。如果您想迭代 C 结构(如 CGPoints),请使用带有 C 数组的标准 for 循环,或将 CGPoints 包装在 NSValues 中。

下面是你的重构在现代 Objective-C 语法中的样子:

NSArray *items = @[
                  [NSValue valueWithPoint:CGPointMake(50, 50)], //wrap the points in an
                  [NSValue valueWithPoint:CGPointMake(270, 50)], //NSValue so they become
                  [NSValue valueWithPoint:CGPointMake(50, 360)], //first class citizens
                  [NSValue valueWithPoint:CGPointMake(270, 360)],//(Y no boxing?*)
                 ]; //End of collection literal
for (NSValue *value in items) { //iterate through the NSValues with our points
    [self someMethod:[value pointValue]]; //'un-wrap' the points by calling -pointValue
}

*我的个人结构拳击宏:

#define STRUCT_BOX(x) [NSValue valueWithBytes:&x objCType:@encode(typeof(x))];

于 2012-12-23T03:52:12.803 回答
0

没有必要求助于 NSArray。正如 CodaFi 所说,“如果您想迭代 C 结构(如 CGPoints),请使用带有 C 数组的标准 for 循环。” 那么,为什么不这样做呢?

static CGPoint items[] = {
    {50, 50},
    {270, 50},
    {50, 360},
    {270, 360},
};

#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))

这会在编译时而不是运行时创建数组!然后迭代数组:

for (NSUInteger i = 0; i < ARRAY_SIZE(items); ++i)
    [self someMethod:items[i]];

有关涉及字典数组的另一个示例,请参阅Objective-C Is Still C (Not Java!)

于 2012-12-23T06:01:05.570 回答