id类型的变量

时间:2014-07-03 16:25:04

标签: objective-c xcode sprite-kit

我有这个代码将sprite节点作为子节点添加到concreteGround节点:

-(void) addObstaclesToNode:(NSString *)pattern
{
    for(int index = 0; index<[self getPattern:pattern].arrayOfSprites.count; ++index)
    {
        id o = [[self getPattern:pattern].arrayOfSprites objectAtIndex:index];
        o.position = CGPointMake(o.position.x + windowW, o.position.y);
        [concreteGround addChild:[[self getPattern:pattern].arrayOfSprites objectAtIndex:index]];
    }
}

getPattern是我创建的用于返回数组中对象的方法)无论如何,我希望变量o接收[[self getPattern:pattern].arrayOfSprites objectAtIndex:index],但该代码可以返回各种类型的对象。我使用id来执行此操作,但是当我尝试访问对象的属性时,Xcode告诉我“在id类型的对象上找不到该属性”。难道我做错了什么?谢谢你的帮助...

2 个答案:

答案 0 :(得分:2)

致你的问:

Objective-C与声明的属性有很大的混乱。 (Lattner在那里?)

对于点表示法,即使它没有说明属性及其访问器的实现方式(合成或显式)和声明(@property或方法声明),编译器不接受任何已知属性,但只接受属性具有已知类型的对象。

你可以做两件事:

  1. 请勿使用点表示法进行访问。 (如果方法在任何地方声明,这是有效的。)

  2. 向下翻转对象。

  3. BTW:你的代码不是很客观。您可以使用快速枚举和索引下标来使其更易读。

答案 1 :(得分:0)

是的,您需要确保o是支持该选择器的类的实例,或者它支持选择器。

if ([o isKindOfClass:[YCYourClass class]]) {
    YCYourClass *yourClass = o;
    yourClass.position = ...
}

或者:

if ([o respondsToSelector:@selector(setPosition:)]) {
    [o performSelector...
}

虽然现在我考虑过它,但您可能只是忘了在声明具有position选择器的接口的地方包含标题......这也可能有用。