方法有2个返回值

时间:2010-06-20 19:48:04

标签: iphone objective-c

我想调用一个返回两个值的方法

基本上可以说我的方法如下(想要返回2个值)

NSString* myfunc
{
   NSString *myString = @"MYDATA";
   NSString *myString2 = @"MYDATA2";
   return myString;
   return myString2;        
}

所以当我打电话给它时,我会用?

NSString* Value1 = [self myfunc:mystring];
NSString* Value2 = [self myfunc:mystring2];

我想我做错了什么,有人可以帮帮我吗? 感谢

7 个答案:

答案 0 :(得分:7)

您只能返回1个值。该值可以是结构或对象或简单类型。如果返回结构或对象,则它可以包含多个值。

返回多个值的另一种方法是使用out参数。在C中通过引用或指针传递。

这是一段代码片段,展示了如何返回包含两个NSStrings的结构:

typedef struct {
    NSString* str1;
    NSString* str2;
} TwoStrings;

TwoStrings myfunc(void) {
    TwoStrings result;
    result.str1 = @"data";
    result.str2 = @"more";
    return result;
}

并称之为:

TwoStrings twoStrs = myfunc();
NSLog(@"str1 = %@, str2 = %@", twoStrs.str1, twoStrs.str2);

返回指针时,即使它们包含在结构中,也需要小心内存管理。在Objective-C中,约定是函数返回自动释放的对象(除非方法名称以create / new / alloc / copy开头)。

答案 1 :(得分:5)

您有几个选择:

  • NSArray :只返回一个数组。很简单。
  • 指针:传入两个指针,然后写入它们而不是返回任何内容。一定要检查NULL!
  • 结构:创建一个包含两个字段的结构,每个字段对应一个要返回的内容,并返回该结构中的一个。
  • 对象:相同的结构,但创建一个完整的NSObject子类。
  • NSDictionary :与NSArray类似,但无需使用值的魔术排序。

答案 2 :(得分:2)

因为你只能返回一个值/对象,所以可以将它们包装在一个数组中:

-(NSArray*) arrayFromMyFunc
{
   NSString *myString = @"MYDATA";
   NSString *myString2 = @"MYDATA2";
   return [NSArray arrayWithObjects:myString,myString2,nil];
}

然后您可以像这样使用它:

NSArray *arr = [self arrayFromMyFunc];

NSString *value1 = [arr objectAtIndex:0];
NSString *value2 = [arr objectAtIndex:1];

你可以通过引用传回结果,但这很容易出错(语法,语义和内存管理的观点)。

编辑还有一件事:确保您确实需要两个返回值。如果它们相当独立,那么两个独立的功能往往是更好的选择 - 更好的可重复性和可持续性。以防万一您将此作为过早优化的问题。 : - )

答案 3 :(得分:2)

您只能直接从函数返回一个值。但有一种方法可以做到这一点。

-(void) myfuncWithVal1:(NSString**)val1 andVal2:(NSString**)val2
{
  *val1 = @"MYDATA";
  *val2 = @"MYDATA2";
}

然后在您使用的方法之外调用它:

NSString* a;
NSString* b;

[self myfuncWithVal1:&a andVal2:&b];

答案 4 :(得分:1)

void myfunc(NSString **string1, NSString **string2)
{
    *string1 = @"MYDATA";
    *string2 = @"MYDATA2";
}

...

NSString *value1, *value2;
myfunc(&value1, &value2);

请记住,在处理字符串和其他对象时,需要将指针传递给指针。

答案 5 :(得分:0)

将两个字符串包裹在NSArray中:

- (NSArray*)myFunc
{
   NSString *myString = @"MYDATA";
   NSString *myString2 = @"MYDATA2";
   return [NSArray arrayWithObjects:myString, myString2, nil];
}

NSArray *theArray = [self myFunc]
NSString *value1 = [theArray objectAtIndex:0];
NSString *value2 = [theArray] objectAtIndex:1];

答案 6 :(得分:0)

我看到每个人都提到了一个N​​SArray,但我会使用NSDictionary,因此不必按顺序添加值,甚至根本不需要添加值。这意味着它能够处理您只想返回第二个字符串的情况。

- (NSDictionary*)myFunction {

   NSString *myString1 = @"string1";
   NSString *myString2 = @"string2";

   return [NSDictionary dictionaryWithObjectsAndKeys: myString1, @"key1", myString2, @"key2", nil];
}

NSDictionary *myDictionary = [self myFunction]
NSString *string1 = [myDictionary objectForKey:@"key1"];
NSString *string2 = [myDictionary objectForKey:@"key2"];