nsmutablearrayにCGPointを追加するにはどうすればよいですか?
-
30-09-2019 - |
質問
cgpointをnsmutableアレイに保存したいので、次のような方法があります。
[self.points addObject:CGPointMake(x, y)];
しかし、私はエラーを受けました、それは次のように言いました
「addobject」の引数1の互換性のないタイプ。
だから、私はAPIをチェックします、
- (void)addObject:(id)anObject
anobjectオブジェクトは、受信者のコンテンツの最後に追加します。この値はゼロであってはなりません。
だから、私は思う」cgpointmake「オブジェクトを作ることはできますが、割り当てることはできません。何が起こりますか?
解決
問題は、CGPointは実際には単なるC構造であることです。それはオブジェクトではありません。
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
iPhoneを使用している場合は、NSValue UIKITの追加を使用して、CGPointをNSValueオブジェクトに変換できます。
例については、この以前の答えを参照してください。 cgpointオブジェクトをnsarrayに簡単に追加するにはどうすればよいですか?
他のヒント
また、次のことを行うこともできます。
[myArray addObject:[NSValue valueWithCGPoint:MyCGPoint]];
残念ながら、CGPointはObjective-Cオブジェクトではありません。 AC構造体です。 AppleがCGPOPEをダブルクリックする場合は、定義にジャンプする必要があります
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
cgpointをnsarrayに保存する場合は、最初にラップする必要があります。これにNSValueを使用するか、独自のラッパーを書くことができます。
編集> Objective-Cメソッド呼び出しごとに小さなオーバーヘッドがあり、オブジェクトが何でも使用される前に多くのメソッド呼び出しを作成して破壊することが含まれます。これについては普通に心配する必要はありませんが、ほとんど動作をカプセル化し、寿命が短い非常に小さなオブジェクトがパフォーマンスに影響を与える可能性があります。 Appleがすべてのポイント、長方形、サイズ、さらにはINT、フロートなどにオブジェクトを使用した場合、パフォーマンスは悪化します。
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
}
それはおそらくそれを行う最も簡単な方法です。完全なクラスを書いて、あらゆる種類のデータ操作を行うことができますが、実際に必要な場合を除き、それはやり過ぎになると思います。
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
}
簡単に処理する方法 CGPoint
(または他の非 NSObject
継承された構造)は、から継承された新しいクラスを作成することです NSObject
.
コードは長いですが、クリーンです。例を以下に示します。
in .hファイル:
@interface MyPoint:NSObject
{
CGPoint myPoint;
}
- (id) init;
- (id) Init:(CGPoint) point;
- (BOOL)isEqual:(id)anObject;
@end
.mファイル:
@implementation MyPoint
- (id) init
{
self = [super init];
myPoint = CGPointZero;
return self;
}
- (id) Init:(CGPoint) point{
myPoint.x = point.x;
myPoint.y = point.y;
return self;
}
- (BOOL)isEqual:(id)anObject
{
MyPoint * point = (MyPoint*) anObject;
return CGPointEqualToPoint(myPoint, point->myPoint);
}
@end
使用法を示すコードサンプルは次のとおりです。忘れないでください リリース!!!
//init the array
NSMutableArray *pPoints;
pPoints = [[NSMutableArray alloc] init];
// init a point
MyPoint *Point1 = [[MyPoint alloc]Init:CGPointMake(1, 1)];
// add the point to the array
[pPoints addObject:[[MyPoint alloc] Point1]];
//add another point
[Point1 Init:CGPointMake(10, 10)];
[pPoints addObject:[[MyPoint alloc] Point1]];
[Point1 Init:CGPointMake(3, 3)];
if ([pPoints Point1] == NO))
NSLog(@"Point (3,3) is not in the array");
[Point1 Init:CGPointMake(1, 1)];
if ([pPoints Point1] == YES))
NSLog(@"Point (1,1) is in the array");