【问题标题】:How can I declare and initialize a n° of variables without knowing how many are?如何在不知道有多少变量的情况下声明和初始化 n° 个变量?
【发布时间】:2014-11-03 16:26:01
【问题描述】:

让我解释一下我的意思:

我需要根据通过方法传递的值声明并初始化 x 个 SKNode 变量(介于 1 和 15 之间):

- (instancetype)initWithNumberOfNodes:(int)number;

每个 SKNode 都将被添加到 NSMutableArray 中,因此我不会遇到引用问题(我将使用 [myArray objectAtIndex:] 获取每个项目)。我不认为创建 15 个 SKNode 变量可能是最好的解决方案,因为会浪费大量内存和奇怪的编程风格。

有什么线索吗?

【问题讨论】:

  • 您应该考虑将节点添加到父 SKNode,然后使用 parentNode.children[index] 访问节点。

标签: objective-c variables sprite-kit declaration sknode


【解决方案1】:

如果您知道您将需要 15 或 number 是什么,您可以将其存储在一个属性中:

@property (nonatomic, assign) NSUInteger number;

- (instancetype)initWithNumberOfNodes:(int)number {
    // ... normal stuff ...

        self.number = number;
        self.nodes = [NSMutableArray arrayWithCapacity:number];

        // Populate with placeholders to avoid out of bounds access later.
        for (int i = 0; i < number; ++i) { 
            self.nodes[i] = [NSNull null];  
        }

    // ... normal stuff ...
}

然后,给自己写一个小助手来懒惰地创建它们。

- (SKNode*)nodeAtIndex:(NSUInteger)index {
    NSAssert(index < self.number, @"bad index");

    SKNode* node = [self.nodes objectAtIndex:index];
    if ([node isKindOfClass:[NSNull class]]) {
        node = [[SKNode alloc] init];  // Or whatever.
        [self.nodes replaceObjectAtIndex:index withObject:node];
    }
    return node;
}

并在您需要节点时使用您的助手:

SKNode* someNode = [self nodeAtIndex:someIndex];

【讨论】:

  • 谢谢 :) 也许是个愚蠢的问题,因为我得到了 -1 票,但我真的想不通!
  • 延迟初始化只是您最终添加到工具箱的众多模式之一。也适用于字典,因为您不必使用 NSNulls 填充它们(如果找不到密钥,-objectForKey: 返回 nil)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多