我想在这里交换玩家所指向的位置。我肯定做错了,但不知道为什么。我还尝试在签名中使用(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;
}
}
}发布于 2010-07-01 09:06:28
虽然卡尔是对的,但这几乎肯定就是你不想做的事情。
也就是说,在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 **)操作,并将所有的lineup操作封装在lineup类中。如果您需要专门化阵容--比方说,-substitutePlayer:应该使用self.substitutes中的最后一个人--那么您可以继承Lineup并这样做。
最终结果是:更清晰的OO设计,更容易维护代码,以及更少的脆弱模式。
(修复了由于在SO的编辑窗口中编码而导致的一些愚蠢的错误。)
发布于 2010-07-01 07:21:28
你已经步入正轨了。您需要将Player **作为类型,使用&调用它,然后在进行赋值时使用*:
*player = sub; 这应该就行了。注意你的内存管理。
https://stackoverflow.com/questions/3154091
复制相似问题