objective-c - 与 Objective C 交换对象

标签 objective-c pointers

我想交换玩家指向的位置。我肯定做错了,但不明白为什么。我还尝试在签名中使用 (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;
        }
    }
}

最佳答案

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

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

鉴于上下文,听起来您正在开发某种棒球类应用程序?假设是这样。

因此,您有一个 Lineup其实例代表 Team 内的阵容的类(甚至可能是其实例代表各个团队的 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 的编辑窗口中编码而导致的一些愚蠢的错误。)

关于objective-c - 与 Objective C 交换对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3154091/

相关文章:

c++ - 指针地址给出 1 而不是十六进制地址

ios - 仅获取下一次 iOS 本地通知的时间

ios - 尝试隐藏页脚/页眉时 collectionView.performBatchUpdates 崩溃

C++ 结构内存布局和 OpenGL glVertexPointer?

c++ - 使用数组作为数组元素时出错

c - 指针算法的奇怪输出

iOS UIView 动画取消不起作用

ios - 如何在聚焦时调整 UISearchController.searchBar 的大小问题?

ios - UIGraphicsGetCurrentContext 与 UIGraphicsBeginImageContext/UIGraphicsEndImageContext

具有结构工作的 C malloc(1)