在属性名称中使用for循环的变量

时间:2013-04-03 16:42:27

标签: objective-c

我想在属性名中使用for循环的变量,例如:

@interface
{
Player *rival1, *rival2, *rival3;
}

int number;
for (number=1; number<=3; number++){
    rival+number = [[Player alloc] init]; //The compiler accepts this.
    rival+number.name = @"";
    //^This line gives the error: "use of undeclared identifier 'rival'"
    //For the first loop, I want it work like: rival1.name = @"";
}

3 个答案:

答案 0 :(得分:2)

这不是一种特别干净的方式来解决这个问题,而是回答你提出的问题:

- (void)generateRivals
{
    for (int i = 1; i < 4; i++)
    {
        NSString *propertySetString = [NSString stringWithFormat:@"setRival%d", i];
        Rival *rival = [[Rival alloc] init];
        [self performSelector:@selector(NSSelectorFromString(propertySetString)) withObject:rival];
    }

}

我们创建了一个选择器(我没有测试过它,但它应该在理论上工作),它对应于i表示的属性实例的getter。

根据您添加的评论,您真正想要的是可变数量的玩家(可能不超过一定数量),并且能够单独引用它们。

在架构上,不是创建指向每个竞争对手的属性,而是将它们全部放在一个数组中(并将其保存为类中的属性)。所以你要像这样创建它们:

- (void)generateRivals:(NSUInteger)numberOfRivals
{

    NSMutableArray *rivalsArray = [[NSMutableArray alloc] initWithCapacity:numberOfRivals];
    for (int i = 0; i < numberOfRivals; i++)
    {
        Rival *rival = [[Rival alloc] init];
        [rivalsArray insertObject:rival atIndex:i];
    }

    [self setRivalsArray:rivals];
}

然后,当你需要访问一个特定的竞争对手时,调用一个这样的方法,它将以你传递的索引号返回竞争对手:

- (Rival *)rivalWithNumber:(NSUInteger)number
{
    return [[self rivalsArray] objectAtIndex:number];
}

答案 1 :(得分:0)

你无法动态创建属性变量名并使用它,因为在编译期间名称会丢失

你可以将它们放在一个数组中并枚举它

Player rival1 = [[Player alloc] init];
Player rival2 = [[Player alloc] init];
Player rival3 = [[Player alloc] init];

for (Player *p in @[rival1, rival2, rival3]) {
    p.name = @"";
}

可能最好的方法是从头开始维护数组中的rivales

@interface …
@property(strong) NSArray *rivals;
@end

@implementation …

//in some useful method, like initializer
_rivals = [NSMutableArray array]
for (int i = 0; i < 3 ++i){
    //create player and add to array
}

@end

您可能需要查看Key Value Coding

您需要为竞争对手创建属性

@interface …

@property(strong) Player *rival1;
@property(strong) Player *rival2;
@property(strong) Player *rival3;

@end

@implementation …

-(id)init…
{
    if(self = [super init…]){
        for (int i = 1; i < 4; ++i) {
            Player *rival = [[Player alloc] init];
            rival.name = [NSString stringWithFormat:@"rival%d", i];
            [self setValue: rival forKey:[NSString stringWithFormat:@"rival%d", i]];
        }
    }
    return self;
}

@end

答案 2 :(得分:0)

不是运行for循环来将玩家的名字设置为@""而只是添加行      name = @""课程的init方法Player。它比写for循环更快,更实用。您还可以创建类似

的方法
-(id)initWithName:(NSString *)initName{
    self = [super init];
    if (self){
      name = initNane;
    }
    return self;
}

设置播放器创建时的名称。虽然如果你想要一个for循环,你可以使用vikingosegundo之前发布的方法。