我想将我的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对象?

其他提示

您也可以执行以下操作:

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

不幸的是,对于您来说,cgpoint不是一个客观-C对象。它是交流结构。如果苹果双击CGPoint,则应跳到定义

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

如果您想将CGPoint存储在NSArray中,则需要首先包装它们。您可以为此使用nsvalue或编写自己的包装器。

将cgpoint转换为nsvalue

编辑>每个Objective-C方法调用都有一个小开销,并且创建和破坏对象涉及许多方法调用,然后才能使用任何方法。您不应该正常担心这一点,而是要封装几乎没有行为并且寿命短的非常小的物体会影响性能。如果Apple用于所有点,RECT,大小甚至INT,Floats等性能,则性能会更糟。

要构建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.

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

在.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");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top