2009-11-05 128 views
1

嘿,所以我正在製作一個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) 

,所以我知道如何做到這一點。謝謝,我希望我給了足夠的信息!

回答

8

你的選擇基本上是在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(也許this one一個很好的教程或this one?)並花一些時間重新考慮對它進行補充。這些概念也適用於Objective-C,對於兩種語言如何工作都非常重要。這有點超出Stack Overflow答案的範圍,你真的需要對它們感到滿意。

+0

我對你將如何使用引用參數有點困惑。我理解它在聲明中的工作原理,但是如何「返回」這些值(您是否還使用「return」)以及如何再次設置變量? 或者是參數自動更新?我有點困惑...... –

1

,如果你想用C的例子中,你將指針傳遞到這兩個變量參數,以便你的函數簽名會是這個樣子:修改那些你只是取消引用它們的值時,

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

然後:

*varTurns = *varTurns - 5; 

或任何你需要做的事情。

原來的函數調用是這樣的:

int otherFunctionVarTurns; 
int otherFunctionVarFatness; 

... 

EndOfTurns(&otherFunctionVarTurns, &otherFunctionVarFatness); 
+0

啊,我想我可能已經得到它了。謝謝你的精彩例子。讓我先測試一下,但是再一次,謝謝。 –

+0

嘿,我試圖做同樣的事情,除了傳遞整數,而不是傳遞一個字符串到函數。該函數將改變字符串,然後返回新的字符串。我想知道如何用字符串來做這件事...... –

+0

字符串變得更復雜,因爲a)它們是Objective-C中的對象,不是像int或struct這樣的值類型,b)它們總是指針,c)它們'通常是不可變的(雖然有一個可變的字符串類型)。首先解決指針,然後閱讀http://developer.apple.com/iphone/library/documentation/cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html –

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

+0

Objective-C仍然使用大量的基本C結構來處理像這樣的值類型,其中定義類是有點矯枉過正的。例如:CGPoint,CGSize,CGRect .... –

+0

或者,將指針返回到您在函數中進行匹配的結構體......但不要忘記在永遠不會使用時釋放內存 –

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"]; 
+0

感謝它解決了我的問題 – Leena