2013-04-03 46 views
-2

我想使用的變量for循環屬性名稱,例如:使用的變量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 = @""; 
} 
+1

你想做什麼? –

+0

請參閱下面的答案。這不是一種簡單的方法,但是您可以從整數中生成一個字符串,並使用SelectorWithString動態調用各個屬性的setter。 – isaac

回答

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]; 
    } 

} 

我們創建了一個選擇(我沒有測試過這一點,但它應該在理論工作)對應於由我代表吸氣的財產情況。

根據您添加的評論,您真正需要的是可變數量的玩家(可能不超過特定數量),並具備單獨參考的能力。

建築上,而不是創建指向每個對手的屬性,而不是將它們全部放在數組中(並將其作爲屬性保存在類中)。所以,你會喜歡這個創建它們:

- (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]; 
} 
+0

對於你已經完成的乾淨的方式,我不太瞭解玩家部分中的*玩家。我使用變量的原因是因爲我可能不會分配所有的對手,只是在數字變量之前指定的數字。用你已經顯示的清潔方法可以做到這一點嗎? – PappaSmalls

+0

乾淨的方法的問題是,必須先創建對象,然後才能進入枚舉 – vikingosegundo

+0

@vikingosegundo - 這是真的。您可以將空值作爲佔位符,但我會刪除該部分答案。 – isaac

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保持數組中的rivales。

你需要爲你的對手

@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 
+0

一致認爲它不值得冒險,但它實際上並不會很難使用關鍵值編碼。 –

+0

@AndrewMadsen,你是對的。我添加了一個KVC的例子 – vikingosegundo

0

相反運行的for循環來的球員的名字設置爲@""只需添加行 name = @""在您Playerinit方法的創建屬性。這比編寫for循環更快更實用。您還可以創建一個方法,如

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

設置播放器創建時的名稱。雖然如果你想絕對使用for循環,你可以使用之前由vikingosegundo公佈的方法。