从函数返回多个值

时间:2009-11-05 01:38:53

标签: iphone c objective-c return-value

嘿,所以我正在制作iPhone应用程序,并且有一个需要调用的常用功能。所以我把它放在它自己的文件中并进行设置,将参数传递给它以及所有这些。但是,我不确定如何最好地从函数返回值。我读过尝试返回数组中的值,但我不知道该怎么做。

int EndOfTurn(int varTurns, int varFatness)
    {
        varTurns--;

        if (varTurns <= 0) {
            varFatness = varFatness - 5;
        }
        else {
            varFatness += 2;
        }
}

我需要返回varTurns和varFatness。但是,这个函数会变得更复杂,我会返回多达10个变量。

截至目前,它是用C语言编写的,而不是Objective-C,(我只是在项目中添加了一个.c文件),但我可以改变它。它需要简单地返回我在函数中使用的所有更新值。如果可以的话,写下函数的声明和类型:

TYPE_HERE EndOfTurn(int varTurns, int varFatness)

所以我确切知道该怎么做。谢谢,我希望我提供了足够的信息!

4 个答案:

答案 0 :(得分:8)

您在Objective-C中的选项与传统C中的选项基本相同:

  1. 使用参考参数或
  2. 返回某种数据结构(结构,类实例),它封装了您想要返回的值集合。
  3. 例如:

    void EndOfTurn(int* varTurns, int* varFatness) { ... }
    

    typedef struct { int turns, int fatness } ReturnType;
    
    ReturnType EndOfTurn(int varTurns, int varFatness) {
      ReturnType foo;
      foo.turns = varTurns-1;
    
      if (foo.turns <= 0) {
        foo.fatness = varFatness - 5;
      }
      else {
        foo.fatness = varFatness + 2;
      }
      return foo;
    }
    

    typedef struct { int turns, int fatness } ReturnType;
    
    void EndOfTurn( ReturnType* param ) {
      param->turns--;
    
      if (param->turns <= 0) {
        param->fatness -= 5;
      }
      else {
        param->fatness += 2;
      }
    }
    

    我建议您在C中找到一个关于指针的好教程(可能是this onethis one?)并花一些时间阅读它。这些概念也适用于Objective-C,对于两种语言的工作原理都非常重要。它有点超出Stack Overflow答案的范围,你真的需要对它们感到满意。

答案 1 :(得分:2)

就个人而言,我会以objective-c方式进行,并将NSDictionary传递出函数。类似的东西:

(NSDictionary *)EndOfTurn:(int)varTurns withFatness:(int)varFatness

    {
        varTurns--;

        if (varTurns <= 0) {
                varFatness = varFatness - 5;
        }
        else {
                varFatness += 2;
        }

    return [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:varFatness],@"FATNESS", [NSNumber numberWithInt:varTurns],@"TURNS",nil];

}

只要你保持钥匙的一致性,感觉就会很好。 您可以像这样访问返回的字典:

int varTurns = [returnedDict objectForKey:@"TURNS"];

答案 2 :(得分:1)

如果你想在C中使用一个例子,你可以将指针传递给这两个变量是参数,所以你的函数签名看起来像这样:

void EndOfTurn(int* varTurns, int* varFatness);

然后在修改那些你刚取消引用它们的值时:

*varTurns = *varTurns - 5;

或者你需要做的任何事情。

原始函数调用如下所示:

int otherFunctionVarTurns;
int otherFunctionVarFatness;

...

EndOfTurns(&otherFunctionVarTurns, &otherFunctionVarFatness);

答案 3 :(得分:1)

既然你已经添加了一个C标签,那么你就可以在普通的C中做到这一点(虽然这可能不是在Objective-C中最常用的方法):

struct turn_state {
    int varTurns;
    int varFatness;
};

void EndOfTurn(struct turn_state *state)
{
        state->varTurns--;

        if (state->varTurns <= 0) {
                state->varFatness -= 5;
        } else {
                state->varFatness += 2;
        }
}

使用struct turn_state变量存储当前状态,并按如下方式调用:

struct turn_state current_state = { /* initial values */ };

/* ...code... */

EndOfTurn(&current_state);

添加更多变量很简单 - 只需将它们添加到struct turn_state