【问题标题】:How To Edit NSArray Objects Like SKNode's如何像 SKNode 一样编辑 NSArray 对象
【发布时间】:2014-05-05 09:33:27
【问题描述】:
-(NSArray*)createArrayOfChunks{

    ProceduralMapGeneration *procedure = [[ProceduralMapGeneration alloc]init];
    [procedure initArrays];

    NSMutableArray *arrayMutable = [[NSMutableArray alloc] init];

    SKNode *object;

    for (int i = 0; i <= 19; i++) {
        object = [procedure createChunk];

        [arrayMutable addObject:object];
    }

    NSArray *array = [arrayMutable copy];

    return array;

}

如果我像这样创建一个数组,然后在另一个方法中调用这里的方法

_arrayOfChunks = [self createArrayOfChunks];

但现在我想编辑_arrayOfChunks[0].position

当我尝试这样做时

_arrayOfChunks[0].position = CGPointMake(screenSizeHalfW, screenSizeHalfH-100);

我收到一个错误

Property 'position' not found on object of type 'id'

现在正如你之前看到的,当我使用createArrayOfChunks: 时,它生成了实例变量object,它是指向SKNode 的指针,那么为什么它告诉我它没有名为位置的属性?我该如何解决这个问题?

【问题讨论】:

    标签: ios objective-c nsarray sprite-kit


    【解决方案1】:

    当您从 NSArray 获取特定索引处的对象时,它总是返回 id 类型的对象,这意味着它不包含任何与类相关的信息。

    试试下面的代码

    id object = _arrayOfChunks[0]
    
    if([object isKindOfClass [SKNode class]])
    {
       [(SKNode *)object setPosition:CGPointMake(screenSizeHalfW, screenSizeHalfH-100)];
    }
    

    这应该会消除错误。

    我们进行检查以确保访问的对象实际上是 SKNode 类型,只要确保在将来将其他类型的对象添加到数组中时我们不会出现异常。

    【讨论】:

    • 有没有其他方法可以将此 id 类型转换为 sknode 而不创建变量,否则它只会违背我使用数组来做我想做的事情的目的
    • 我创建变量只是为了便于阅读。您仍然可以执行以下操作if([_arrayOfChunks[0] isKindOfClass [SKNode class]]){[(SKNode *)_arrayOfChunks[0] setPosition:CGPointMake(screenSizeHalfW, screenSizeHalfH-100)];}
    • 喜欢吗? [(SKNode*)_arrayOfChunks[0] setPosition:CGPointMake(screenSizeHalfW, screenSizeHalfH-100)]; 它在没有 if 语句的情况下编译并且仍然做同样的事情,另一个问题是为什么 (SKNode*)_arrayOfChunks[0] 之前它像某种返回值一样工作?如果是的话,它在哪里返回它?
    • 看到我上面的问题了吗? @Suhas
    • @Mutch95 与 C 数组只能存储特定类型的值不同,NSArray 可以存储多种类型的对象,因此它只能将对象识别为类型 id。例如,_arrayOfChunks[0] 可以是 SKNode 类型的对象,_arrayOfChunks[1] 可以是 NSString 类型的对象。因此,使用 if 条件非常重要。否则它将导致崩溃,因为 NSString 不响应 setPosition:。 Objective-C 是一种动态类型语言,我建议您在深入研究之前阅读更多有关它的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多