我想调用一个返回两个值的方法
基本上可以说我的方法如下(想要返回2个值)
NSString* myfunc
{
NSString *myString = @"MYDATA";
NSString *myString2 = @"MYDATA2";
return myString;
return myString2;
}
所以当我打电话给它时,我会用?
NSString* Value1 = [self myfunc:mystring];
NSString* Value2 = [self myfunc:mystring2];
我想我做错了什么,有人可以帮帮我吗? 感谢
答案 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)
您有几个选择:
答案 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)
我看到每个人都提到了一个NSArray,但我会使用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"];