-2

我想在属性名称中使用 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 = @"";
}
4

3 回答 3

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];
}
于 2013-04-03T16:53:03.823 回答
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 = @"";
}

可能最好的方法是从一开始就保持阵列中的竞争对手

@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
于 2013-04-03T16:53:48.373 回答
0

而不是运行for循环来设置玩家的名称,只需在类 的方法中@""添加该行 。它比编写循环更快,更实用。您还可以创建一个方法,如name = @""initPlayerfor

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

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

于 2013-04-03T18:42:18.910 回答