对此最基本的解决方案是将玩家存储在数组或字典中(键入玩家名称)。采用数组方式:
// assume we have an NSArray property, players
NSMutableArray *tempPlayers = [NSMutableArray arrayWithCapacity:[playerNames count]];
for (NSString *name in playerNames) {
Player *player = [[Player alloc] init];
[tempPlayers addObject:player];
[player release];
}
self.players = tempPlayers;
您现在可以通过调用objectAtIndex: 从players 属性访问每个玩家。
关于设计的一句话——首先,您是否考虑过在您的 Player 类中添加一个 name 属性?在您捕获这些信息之后,这似乎是一个自然的存储位置。例如:
for (NSString *name in playerNames) {
// you might also have a designated initializer
// e.g. [[Player alloc] initWithName:name]
Player *player = [[Player alloc] init];
player.name = name;
[tempPlayers addObject:player];
[player release];
}
总的来说,这是最简单的工作,也是我现在要做的所有事情。不过,未来……
在某些时候,您可能会发现自己引入了某种 Game 类,代表您的用户创建的每个新游戏。这将是存储玩家数组的自然场所,并且可以让您构建更具凝聚力的界面,例如:
Game *newGame = [[Game alloc] init];
for(NSString *name) in playerNames) {
[newGame addPlayerNamed:name];
}
您的 Game 类将封装玩家数组,addPlayerNamed 方法将封装创建新 Player 并将其存储在该数组中的过程,从而使您的控制器代码更加简单(并且意图揭示)在这个过程中。
这样做的另一个好处是,它为您提供了一种能够在整个应用程序中访问这些数据的方法,而不是将其绑定在这个特定的控制器中。您可以实现对“currentGame”的某种类似单例的访问。当然不是真正的单身人士,但这样的事情会很好用:
Game *newGame = [[Game alloc init];
.. // configure game as above
[Game setCurrentGame:newGame];
所以现在,当您需要访问当前游戏(或玩家)信息时:
// in some other controller
Game *currentGame = [Game currentGame];
for(Player *player in currentGame.players) {
// etc...
}