如何添加一个CGPoint到NSMutableArray?

我想将我的CGPoint存储到NSMutable数组,所以我有这样的方法:

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

但是我得到了错误,它说:

“addObject”的参数1不兼容的types。

所以,我检查了API,

 - (void)addObject:(id)anObject 

anObject要添加到接收者内容末尾的对象。 这个值不能为零。

所以,我认为“ CGPointMake ”可以做一个对象,但是不能指定。 怎么了?

问题是,CGPoint实际上只是一个C结构,它不是一个对象:

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

如果您在iPhone上,则可以使用NSValue UIKit附加function将CGPoint转换为NSValue对象。

看到这个以前的答案的例子: 如何添加CGPoint对象到一个NSArray的简单方法?

您还可以执行以下操作:

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

不幸的是,CGPoint不是一个Objective-c对象。 这是交stream结构。 如果你双击CGPoint,你应该跳转到定义

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

如果你想将CGPoint存储在一个NSArray中,你将需要先包装它们。 你可以使用NSValue来编写你自己的包装器。

请参阅将CGPoint转换为NSValue

编辑>每个objective-c方法调用都有一个小的开销,创build和销毁对象在甚至用于任何事情之前都会涉及很多方法调用。 你不应该担心这个问题,但是对于封装很less行为的非常小的对象来说,它会影响性能。 如果苹果使用的所有点,矩形,大小,甚至整数,浮动等性能会更糟糕的对象。

要build立在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 } 

这可能是最简单的方法。 你可以写一个完整的类,并进行所有types的数据操作,但我认为这将是一个矫枉过正,除非你真的必须。

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 (或任何其他非NSObjectinheritance结构)的简单方法是创build一个从NSObjectinheritance的新类。

代码更长,但干净。 下面是一个例子:

在.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");