如何将类id的对象强制转换为CGPoint for NSMutableArray?

时间:2012-12-01 19:26:44

标签: objective-c class casting cgpoint

如果我有一个类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];
}

2 个答案:

答案 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

的缩写