[英]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中的選擇基本相同:
例如:
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(¤t_state);
添加更多變量很簡單-只需將它們添加到struct turn_state
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.