代码之家  ›  专栏  ›  技术社区  ›  rob5408

用Objective C交换对象

  •  2
  • rob5408  · 技术社区  · 14 年前

    我想交换球员指的位置。我肯定做错了,但不知道为什么。我也尝试过在签名和&中使用(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;
            }
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  13
  •   bbum    14 年前

    虽然卡尔是对的,但几乎可以肯定的是,这正是你不想做的。

    也就是说,在Cocoa或iOS中,通过引用传递值以远程更新值的情况非常罕见。除了脆弱和容易出错之外,它通常也违反了封装这一基本的OO原则。

    因此,你有一个 Lineup 类,其实例表示团队中的一个列表(甚至可能是一个团队类,其实例表示单个团队),每个团队管理一个 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 --你可以把 阵容 并且这样做。

    最终结果;更干净的OO设计,更容易维护代码,更不脆弱的模式。

    (修复了由于在SO的编辑窗口中进行编码而导致的一些愚蠢的错误。)

        2
  •  3
  •   bbum    14 年前

    你已经走上正轨了。你需要有 Player ** & ,然后使用 * 当你做作业时:

    *player = sub;