我想在属性名中使用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 = @"";
}
答案 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之前发布的方法。