在Objective-C中将对象添加到NSMutableArray

时间:2015-11-06 07:17:31

标签: objective-c

我遇到了一个相当简单的任务:向Objective-C中的NSMutableArray添加对象。以下是我已经尝试过的百万种方式:

NSMutableArray* foregroundPoints;

Point point;

// Fails with "No viable conversion from 'Point' to 'id _Nonnull'"
[foregroundPoints addObject: point];

// Fails with "Cannot initialise a parameter of type 'id _Nonull' with an rvalue of type 'Point *'"
[foregroundPoints addObject: &point];

// Fails with: "Illegal type 'Point' used in boxed expression"
[foregroundPoints addObject: @(point)];

Point *pointPtr;

// Fails with "Cannot initialise a parameter of type 'id _Nonull' with an lvalue of type 'Point *'"
[foregroundPoints addObject: pointPtr];

// Fails with "Cannot initialise a parameter of type 'id _Nonull' with an rvalue of type 'Point **'"
[foregroundPoints addObject: &pointPtr];

//Fails with: "Illegal type 'Point *' used in boxed expression"
[foregroundPoints addObject: @(pointPtr)];

我应该如何将Point添加到NSMutableArray

(NB从评论和一些答案中我看到我对Point感到困惑。我认为它是一个Objective-C库类但实际上它是一个C ++结构从我项目的其他地方开始。所以我的问题可以归结为:我如何向CGPoint添加NSMutableArray?我将未经编辑的主要问题保留为评论中的讨论和不要混淆PointCGPoint的答案也很有趣。)

4 个答案:

答案 0 :(得分:3)

正如其他人所说,NSArray只保存Objective-C对象。要保存C类型,您需要将它们装入对象中。

您需要在此处使用NSValue或NSString。 NSValue具有最常见的Foundation结构和基元的装箱方法。

还有一些函数也可以转换为NSString和从NSString转换为其中的几个。请参阅基础功能参考。

可以使用NSValue子类NSNumber

对标量C类型进行装箱和取消装箱

nil必须使用NSNull

表示

答案 1 :(得分:3)

问题是只能将对象添加到NSArray或NSDictionary等集合中。

转换你的"点" (可能是CGPoint或NSPoint struct )到可以添加到数组的NSValue对象中。

  

使用此类处理集合(例如NSArray和NSSet)中的此类数据类型,键值编码以及需要Objective-C对象的其他API。

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSValue_Class/

例如,使用+ valueWithCGPoint:将点转换为可添加到数组的NSValue表示。

CGPoint point;
NSValue *pointValue = [NSValue valueWithCGPoint:point];
[foregroundPoints addObject:pointValue];

然后,稍后,使用- CGPointValue将对象转换回原始类型。

答案 2 :(得分:1)

@pkamb回答就是这样。

但是,如果您需要性能,请使用标准C数组来存储您的点,而不是多次调用valueWithCGPoint和CGPointValue。

将其嵌入到NSObject(例如,名为PointArray)中进行操作。

@interface PointArray : NSObject

-(Point)pointAtIndex:(NSUInteger)index;
-(void)addPoint:(Point)point;

…

@property(nonatomic,readonly) NSUInteger numberOfPoints;

@end

@implementation PointArray
{
    Point     *points;
    NSUInteger numberOfPoints;
}

// You'll have to work a bit there ..

@end

答案 3 :(得分:0)

您正尝试使用NSArray初始化NSMutableArray对象。

为什么不试试这个...

foregroundPoints = [NSMutableArray arrayWithObjects: @(startPoint), @(endPoint), nil];

使用NSArray初始化NSMutableArray foregroundPoints到NSMutableArray。