如果我有一个类id的对象myObject,我将如何将其“转换”为CGPoint(假设我已经执行了内省并且知道myObject到CGPoint)?尽管CGPoint不是真正的Obj-C类,但这是事实。
只需执行(CGPoint)myObject
即可返回以下错误:
Used type 'CGPoint' (aka 'struct CGPoint') where arithmetic or pointer type is required
我想这样做,以便我可以检查传递给NSMutableArray的对象是否是CGPoint,如果是,则自动将CGPoint包装在NSValue中; e.g:
- (void)addObjectToNewMutableArray:(id)object
{
NSMutableArray *myArray = [[NSMutableArray alloc] init];
id objectToAdd = object;
if ([object isKindOfClass:[CGPoint class]]) // pseudo-code, doesn't work
{
objectToAdd = [NSValue valueWithCGPoint:object];
}
[myArray addObject:objectToAdd];
return myArray;
}
其他代码
以下是我用来执行“内省”的功能:
+ (BOOL)validateObject:(id)object
{
if (object)
{
if ([object isKindOfClass:[NSValue class]])
{
NSValue *value = (NSValue *)object;
if (CGPointEqualToPoint([value CGPointValue], [value CGPointValue]))
{
return YES;
}
else
{
NSLog(@"[TEST] Invalid object: object is not CGPoint");
return NO;
}
}
else
{
NSLog(@"[TEST] Invalid object: class not allowed (%@)", [object class]);
return NO;
}
}
return YES;
}
+ (BOOL)validateArray:(NSArray *)array
{
for (id object in array)
{
if (object)
{
if ([object isKindOfClass:[NSValue class]])
{
NSValue *value = (NSValue *)object;
if (!(CGPointEqualToPoint([value CGPointValue], [value CGPointValue])))
{
NSLog(@"[TEST] Invalid object: object is not CGPoint");
return NO;
}
}
else
{
NSLog(@"[TEST] Invalid object: class not allowed (%@)", [object class]);
return NO;
}
}
}
return YES;
}
+ (NSValue *)convertObject:(CGPoint)object
{
return [NSValue valueWithCGPoint:object];
}
答案 0 :(得分:5)
CGPoint
不是Objective-C对象。您无法将一个传递给addObjectToNewMutableArray:
方法。编译器不会让你。
您需要将CGPoint
包裹在NSValue
中并将该包装传递给addObjectToNewMutableArray:
方法。
如果您有NSValue
,并且想要测试它是否包含CGPoint
,您可以这样问:
if (strcmp([value objCType], @encode(CGPoint)) == 0) {
CGPoint point = [value CGPointValue];
...
}
答案 1 :(得分:0)
一个点不是一个对象,因此无法投射到一个...... 反之亦然
转换不转换数据只会改变数据的解释方式!
id基本上是NSObject * btw
的缩写