簡體   English   中英

從函數返回多個值

[英]Returning Multiple Values from a Function

嘿,所以我要制作一個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)

所以我確切地知道該怎么做。 謝謝,希望我能提供足夠的信息!

在Objective-C中,您的選擇與在常規C中的選擇基本相同:

  1. 使用參考參數,或
  2. 返回某種數據結構(結構,類實例),該數據結構封裝了要返回的值的集合。

例如:

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很好的教程(也許這一個這一個 ?),並采取一些時間閱讀了它。 這些概念也適用於Objective-C,並且是兩種語言如何工作的基礎。 這有點超出堆棧溢出答案的范圍,您確實需要對它們感到滿意。

就我個人而言,我將以目標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"];

如果要在C中使用示例,則將指向這兩個變量的指針傳遞給參數,以便函數簽名看起來像這樣:

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

然后,在修改這些值時,只需取消引用它們即可:

*varTurns = *varTurns - 5;

或您需要執行的任何操作。

原始函數調用如下所示:

int otherFunctionVarTurns;
int otherFunctionVarFatness;

...

EndOfTurns(&otherFunctionVarTurns, &otherFunctionVarFatness);

既然您已經添加了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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM