使用Objective C交换对象

时间:2010-06-30 23:13:57

标签: objective-c pointers

我想交换玩家指向的位置。我肯定做错了,但无法弄明白为什么。当我打电话时,我也尝试在签名和&播放器中使用(播放器**)播放器。有什么想法吗?

- (void)handleResult:(Result)result forPlayer:(Player *)player inLineup:(Lineup *)lineup
{
    switch (result)
    {
        case ResultSub:
        {
            Player *sub = [lineup.substitutes objectAtIndex:0];
            player = sub;
            return;
            break;
        }
    }
}

2 个答案:

答案 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; 

应该这样做。留意你的记忆管理。