我想交换玩家指向的位置。我肯定做错了,但不明白为什么。我还尝试在签名中使用 (Player **)player ,并在调用时使用 &player 。有什么想法吗?
- (void)handleResult:(Result)result forPlayer:(Player *)player inLineup:(Lineup *)lineup
{
switch (result)
{
case ResultSub:
{
Player *sub = [lineup.substitutes objectAtIndex:0];
player = sub;
return;
break;
}
}
}
最佳答案
虽然卡尔是正确的,但这几乎肯定正是你不想做的。
也就是说,在 Cocoa 或 iOS 中,通过引用传递值以进行远程更新的情况非常罕见。除了脆弱和容易出错之外,它通常还违反了封装这一基本的 OO 原则。
鉴于上下文,听起来您正在开发某种棒球类应用程序?假设是这样。
因此,您有一个 Lineup
其实例代表 Team 内的阵容的类(甚至可能是其实例代表各个团队的 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 的编辑窗口中编码而导致的一些愚蠢的错误。)
关于objective-c - 与 Objective C 交换对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3154091/