我有一个方法,它将NSMutableArray作为参数,我希望它返回该数组,在方法中创建的另一个数组,以及由该方法创建的int。我意识到这可以通过创建一个包含所有这些对象的数组并返回它,然后从方法外部的数组中删除它们来完成,但还有另一种返回多个对象的方法吗?
答案 0 :(得分:9)
传递多个值的典型方法是:
以上是许多情况下的好解决方案,但这是另一种在其他情况下可能效果最佳的解决方案:
在方法中添加一个块:
- (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);
}
希望有所帮助。 ;)