我想交换玩家指向的位置。我肯定做错了,但无法弄明白为什么。当我打电话时,我也尝试在签名和&播放器中使用(播放器**)播放器。有什么想法吗?
- (void)handleResult:(Result)result forPlayer:(Player *)player inLineup:(Lineup *)lineup
{
switch (result)
{
case ResultSub:
{
Player *sub = [lineup.substitutes objectAtIndex:0];
player = sub;
return;
break;
}
}
}
答案 0 :(得分:13)
虽然卡尔是正确的,但这几乎肯定是你不想做的事情。
即,在Cocoa或iOS中,通过引用传递值以远程更新它是极其罕见的。除了脆弱和容易出错之外,它通常也违反了封装,这是一个基本的OO主体。
鉴于上下文,听起来你正在做某种类型的棒球应用程序?假设如此。
因此,您有一个Lineup
类,其实例代表一个团队中的阵容(甚至可能是一个Team类,其实例代表各个团队),每个团队管理一个Player
个实例的阵容。
所以,你可能有类似的东西:
@interface Lineup:NSObject
- (BOOL) substitutePlayer: (Player *) sub;
@end
你可以这样称呼它:
- (void)handleResult:(Result)result
forPlayer:(Player *)player
inLineup:(Lineup *)lineup
{
... handle substituion ...
[lineup substitutePlayer: player];
}
您可以将substitutePlayer:
实现为:
- (BOOL) substitutePlayer: (Player *) playerToReplace;
{
NSUInteger *index = [self.players indexOfObject: playerToReplace];
[self.players replaceObjectAtIndex: index withObject: [self.substitutes objectAtIndex: 0]];
[self.substitues removeObjectAtIndex: 0];
return YES;
}
通过执行此操作,您可以避免使用愚蠢的(Player **)
内容,并将所有阵容操作封装在阵容类中。如果你需要专门化阵容 - 比如,-substitutePlayer:
应该使用self.substitutes
中的最后一个人 - 你可以继承Lineup
并且这样做。
最终结果;更清晰的OO设计,更容易维护代码,以及更不易碎的模式。
(修正了SO编辑窗口编码导致的一些愚蠢错误。)
答案 1 :(得分:3)
你正在走上正轨。您需要Player **
作为类型,使用&
进行调用,然后在执行作业时使用*
:
*player = sub;
应该这样做。留意你的记忆管理。