首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Objective C交换对象

使用Objective C交换对象
EN

Stack Overflow用户
提问于 2010-07-01 07:13:57
回答 2查看 2K关注 0票数 2

我想在这里交换玩家所指向的位置。我肯定做错了,但不知道为什么。我还尝试在签名中使用(Player **)player,并在调用它时使用&player。有什么想法吗?

代码语言:javascript
运行
复制
- (void)handleResult:(Result)result forPlayer:(Player *)player inLineup:(Lineup *)lineup
{
    switch (result)
    {
        case ResultSub:
        {
            Player *sub = [lineup.substitutes objectAtIndex:0];
            player = sub;
            return;
            break;
        }
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2010-07-01 09:06:28

虽然卡尔是对的,但这几乎肯定就是你不想做的事情。

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

根据上下文,听起来像是在做某种棒球类的应用程序?假设是这样。

因此,您有一个Lineup类,它的实例代表一个团队中的一个阵容(甚至可能是一个代表各个团队的Team类),每个团队管理一个Player实例阵容。

因此,您可能会有如下内容:

代码语言:javascript
运行
复制
@interface Lineup:NSObject
- (BOOL) substitutePlayer: (Player *) sub;
@end

你可以这样称呼它:

代码语言:javascript
运行
复制
- (void)handleResult:(Result)result
           forPlayer:(Player *)player
            inLineup:(Lineup *)lineup
{
    ... handle substituion ...
    [lineup substitutePlayer: player];
}

您可以将substitutePlayer:实现为:

代码语言:javascript
运行
复制
- (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的编辑窗口中编码而导致的一些愚蠢的错误。)

票数 13
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3154091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档