我遇到了一个相当简单的任务:向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
?我将未经编辑的主要问题保留为评论中的讨论和不要混淆Point
和CGPoint
的答案也很有趣。)
答案 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。
例如,使用+ 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。