从Objective-C中的方法返回多个对象

时间:2010-09-12 22:22:57

标签: objective-c methods return-value

我有一个方法,它将NSMutableArray作为参数,我希望它返回该数组,在方法中创建的另一个数组,以及由该方法创建的int。我意识到这可以通过创建一个包含所有这些对象的数组并返回它,然后从方法外部的数组中删除它们来完成,但还有另一种返回多个对象的方法吗?

4 个答案:

答案 0 :(得分:9)

传递多个值的典型方法是:

  • 通过引用添加额外参数(例如,通常传递NSErrors 这样)
  • 将它们传回一些其他结构或对象,通常是一个 NSDictionary或自定义类

以上是许多情况下的好解决方案,但这是另一种在其他情况下可能效果最佳的解决方案:

在方法中添加一个块:

- (void)myMethodWithMultipleReturnObjectsForObject:(id)object returnBlock:(void (^)(id returnObject1, id returnObject2))returnBlock
{
    // do stuff

    returnBlock(returnObject1, returnObject2);
}

然后使用这样的方法:

[myMethodWithMultipleReturnObjectsForObject:object returnBlock:^(id returnObject1, id returnObject2) {
    // Use the return objects inside the block
}];

上例中的返回对象只能在块中使用,因此如果要保留它们以便在块外使用,只需设置一些__block vars。

// Keep the objects around for use outside of the block
__block id object1;
__block id object2;
[myMethodWithMultipleReturnObjectsForObject:object returnBlock:^(id returnObject1, id returnObject2) {
    object1 = returnObject1;
    object2 = returnObject2;
}];

答案 1 :(得分:7)

使用NSDictionary返回多个值是在Obj-C中执行此操作的常用方法。

方法签名看起来像这样:

-(NSDictionary *)doSomeStuffThatReturnsMultipleObjects;

并且您将要在相应的文件中定义字典键。

// Header File
extern NSString *const JKSourceArray;
extern NSString *const JKResultsArray;
extern NSString *const JKSomeNumber;

// Implementation File
NSString *const JKSourceArray = @"JKSourceArray";
NSString *const JKResultsArray = @"JKResultsArray";
NSString *const JKSomeNumber = @"JKSomeNumber";

使用数组的优点是元素的顺序和元素的存在/不存在无关紧要,如果您想要返回其他对象,将来更容易扩展。它比通过引用传递更灵活和可扩展。

答案 2 :(得分:2)

另一种方法是让用户传递一个他们想要用来保存数据的指针。这是一个返回数组的示例,它使用指针为您提供int值和另一个数组。编辑好在这里是我自己测试的工作版本:

- (NSMutableArray*)doStuff:(int*)container returnedArray:(NSMutableArray*)arrayContainer{
   int a = 4;
   *container = a;
   [arrayContainer removeAllObjects];
   [arrayContainer addObject:@"object"];
   return [NSMutableArray arrayWithObjects:@"object",nil];
}

你可以这样说:

int value = 0;
NSMutableArray* new = [NSMutableArray array];
[self doStuff:&value returnedArray:new];

它基本上就像回归一样!

答案 3 :(得分:0)

您可能需要考虑返回结构。

typedef struct {
    NSMutableArray *array1;
    NSArray *array2;
    NSInteger integer;
} MyAwesomeReturnValue;

您的方法现在看起来像这样:

- (MyAwesomeReturnValue)myAwesomeMethod:(NSMutableArray *)parameter
{
    MyAwesomeReturnValue retval;
    retval.array1 = parameter;
    retval.array2 = [NSArray array];
    retval.integer = 5;

    return retval;
}

你会像以下一样使用它:

- (void)anotherAwesomeMethod
{
    NSMutableArray *array = [NSMutableArray array];
    MyAwesomeReturnValue returnedValue = [self myAwesomeMethod:array];

    NSLog(@"%@", returnedValue.array1);
    NSLog(@"%@", returnedValue.array2);
    NSLog(@"%d", returnedValue.integer);
}

希望有所帮助。 ;)