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はまだC(Javaではありません!)を参照してください。

于 2012-12-23T06:01:05.570 に答える