如何将CGPoint添加到NSMutableArray?

时间:2010-04-21 15:52:31

标签: iphone objective-c nsarray cgpoint

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

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

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

  

参数1的不兼容类型   “ADDOBJECT”。

所以,我查看了API,

- (void)addObject:(id)anObject
  

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

所以,我认为“ CGPointMake ”可以创建一个Object,但不能分配它。会发生什么?

6 个答案:

答案 0 :(得分:36)

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

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

如果你在iPhone上,你可以使用NSValue UIKit添加来将CGPoint转换为NSValue对象。

有关示例,请参阅此前一个答案:How can I add CGPoint objects to an NSArray the easy way?

答案 1 :(得分:31)

您还可以执行以下操作:

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

答案 2 :(得分:11)

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

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

如果要将CGPoint存储在NSArray中,则需要先将它们包装起来。您可以使用NSValue或编写自己的包装器。

请参阅Converting a CGPoint to NSValue

编辑>每个objective-c方法调用都有一个小的开销,创建和销毁对象涉及许多方法调用,甚至在它们被用于任何东西之前。你不应该担心这种情况,但对于非常小的物体来说,这些物体封装的行为很少,而且寿命很短,它会影响性能。如果Apple使用对象来获取所有点,矩形,大小甚至整数,浮点数等,性能会更差。

答案 3 :(得分:3)

要建立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
}

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

答案 4 :(得分:0)

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
}

答案 5 :(得分:-1)

处理CGPoint(或任何其他非NSObject继承结构)的简单方法是创建一个继承自NSObject的新类。

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

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