使用Objective C交换对象

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编辑窗口编码导致的一些愚蠢错误.)

  • 给予好评.在过去6年左右的时间里,除了NSError之外,我认为我从未见过obj-c中的"通过引用传递更新". (2认同)