web-dev-qa-db-ja.com

NSMutableArrayにCGPointを追加するにはどうすればよいですか?

CGPointをNSMutable配列に保存したいので、次のようなメソッドがあります。

[self.points addObject:CGPointMake(x, y)];

しかし、私はエラーを受け取りました、それはそれを言った:

「addObject」の引数1のタイプに互換性がありません。

それで、私はAPIをチェックします、

- (void)addObject:(id)anObject

anObjectレシーバーのコンテンツの最後に追加するオブジェクト。この値はnilであってはなりません。

したがって、 "CGPointMake"はオブジェクトを作成できますが、割り当てることはできません。何が起こるのですか?

41
Tattat

問題は、CGPointが実際には単なるC構造体であり、オブジェクトではないことです。

struct CGPoint {
   CGFloat x;
   CGFloat y;
};
typedef struct CGPoint CGPoint;

IPhoneを使用している場合は、NSValue UIKitオプションを使用して、CGPointをNSValueオブジェクトに変換できます。

例については、この前の回答を参照してください。 CGArrayオブジェクトをNSArrayに簡単に追加するにはどうすればよいですか?

36
kharrison

次のこともできます。

[myArray addObject:[NSValue valueWithCGPoint:MyCGPoint]];
31
atbreuer11

残念ながら、CGPointはObjective-cオブジェクトではありません。それはc構造体です。 Apple CGPointをダブルクリックすると、定義にジャンプする必要があります

struct CGPoint {
    CGFloat x;
    CGFloat y;
};
typedef struct CGPoint CGPoint;

CGPointをNSArrayに格納する場合は、最初にそれらをラップする必要があります。このためにNSValueを使用するか、独自のラッパーを作成できます。

参照 CGPointからNSValueへの変換

編集>各objective-cメソッドの呼び出しには小さなオーバーヘッドがあり、オブジェクトの作成と破棄には、それらが何かに使用される前に多くのメソッドの呼び出しが含まれます。通常はこれについて心配する必要はありませんが、動作がほとんどカプセル化されておらず、寿命が短い非常に小さなオブジェクトの場合、パフォーマンスに影響を与える可能性があります。 Appleがすべてのポイント、四角形、サイズ、さらには整数、浮動小数点数などのオブジェクトに使用された場合、パフォーマンスは低下します。

11
hooleyhoop

Atbreuer11によって与えられた答えに基づいて、CGPointをNSValueに変換し、それをNSMutableArrayに格納し、次のように変換して戻すことができます。

//Convert CGPoint and Store it
CGPoint pointToConvert = CGPointMake(100.0f, 100.0f);
NSValue *valueToStore = [NSValue valueWithCGPoint:pointToConvert];
NSMutableArray *arrayToKeep =[NSMutableArray arrayWithObject:valueToStore];

次に、それを再度復元します。

CGPoint takeMeBack;
for (NSValue *valuetoGetBack in arrayToKeep) {
    takeMeBack = [valuetoGetBack CGPointValue];
    //do something with the CGPoint
}

それがおそらく最も簡単な方法です。完全なクラスを作成して、すべてのタイプのデータ操作を行うことができますが、本当に必要な場合を除いて、それはやり過ぎになると思います。

3
Septronic

Swift 3.x
// CGPointをNSValueに変換

let cgPoint = CGPoint(x: 101.4, y: 101.0)
let nsValue = NSValue(cgPoint: cgPoint)
var array = NSArray(object: nsValue)

//再度復元します

var cgPoint : CGPoint!
for i in array {
  cgPoint = i as? CGPoint
}
0
yo2bh