rob*_*408 2 pointers objective-c
我想交换玩家指向的位置.我肯定做错了,但无法弄明白为什么.当我打电话时,我也尝试在签名和播放器中使用(播放器**)播放器.有任何想法吗?
- (void)handleResult:(Result)result forPlayer:(Player *)player inLineup:(Lineup *)lineup
{
switch (result)
{
case ResultSub:
{
Player *sub = [lineup.substitutes objectAtIndex:0];
player = sub;
return;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
bbu*_*bum 13
虽然卡尔是正确的,但这几乎肯定是你不想做的事情.
也就是说,在Cocoa或iOS中极少见的是通过引用传递值以远程更新它们.除了脆弱和容易出错之外,它通常也违反了封装,这是一个基本的OO主体.
鉴于上下文,听起来你正在做某种类型的棒球应用程序?假设如此.
因此,您有一个Lineup类,其实例代表一个团队中的阵容(甚至可能是一个Team类,其实例代表各个团队),每个团队管理一个Player实例阵容.
所以,你可能有类似的东西:
@interface Lineup:NSObject
- (BOOL) substitutePlayer: (Player *) sub;
@end
Run Code Online (Sandbox Code Playgroud)
你可以这样称呼它:
- (void)handleResult:(Result)result
forPlayer:(Player *)player
inLineup:(Lineup *)lineup
{
... handle substituion ...
[lineup substitutePlayer: player];
}
Run Code Online (Sandbox Code Playgroud)
你可以实现substitutePlayer:as:
- (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;
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,你可以避免愚蠢的(Player **)东西,并将所有阵容操作封装在阵容类中.如果你曾经需要专门化阵容 - 比如,-substitutePlayer:应该使用最后一个人self.substitutes- 你可以继承Lineup并做到这一点.
最终结果; 更简洁的OO设计,更容易维护代码,以及更不易碎的模式.
(修正了SO编辑窗口编码导致的一些愚蠢错误.)