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

Eth*_*ick 26 iphone objective-c return-value

我问了一个类似的问题,但我无法让它完全正常工作.我正在构建一个iPhone应用程序,我想从不同的文件中调用一个方法.我认为最简单的方法就是在另一个文件中创建一个方法,并从其他文件中调用该方法.

这是一些问题.我需要在传递多个值后从该方法返回多个值.例如,我正在传递它:(int, int, int, string, string).并且它们需要在更改后返回所有这些值.有人给我看了这段代码:

- (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];

}
Run Code Online (Sandbox Code Playgroud)

但是,此代码不起作用,我需要更多信息才能真正理解它.让我们假设我传递了这些值:

int varMoney;
int varNumSheep;
int varNumShepherds;
NSString *test1;
NSString *test2;
Run Code Online (Sandbox Code Playgroud)

所以我需要从方法中获取所有这些值.

如何在头文件中声明这个?这应该是一个Objective-C文件,但是你可以给我整个文件的代码,这样我就可以看到它会带来什么,@implementation以及@end诸如此类的东西.另外,我怎么称呼这种方法?

Dav*_*ong 64

如何将值作为指针传递?

例如:

- (void) getValuesForInt:(int *)int1 anotherInt:(int *)int2 aBool:(BOOL *)bool1 anotherBool:(BOOL *)bool2 {
  if (*int1 == 42 && *int2 == 0) {
    *int1 = 0;
    *int2 = 42;
  }
  if (*bool1 == NO) {
    *bool2 = YES;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以调用它:

int int1 = 42;
int int2 = 0;
BOOL bool1 = NO;
BOOL bool2 = NO;
[self getValuesForInt:&int1 anotherInt:&int2 aBool:&bool1 anotherBool:&bool2];
NSLog(@"int1: %d int2: %d bool1: %d bool2: %d", int1, int2, bool1, bool2);
//prints "int1: 0 int2: 42 bool1: 0 bool2: 1"
Run Code Online (Sandbox Code Playgroud)

编辑:

这同样适用于对象.在处理NSError对象时,您经常会看到这种情况:

NSError *error = nil;
[anObject doSomething:foo error:&error];
Run Code Online (Sandbox Code Playgroud)

可以实现为:

- (void) doSomething:(id)terrible error:(NSError **)error {
  if ([terrible isEqual:reallyBad]) {
    if (error != nil) { *error = [NSError errorWithDomain:@"domain" code:42 userInfo:nil]; }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • +1这是标准方式.许多Apple API都这样做,例如,"返回"指向NSError对象的指针.参见`NSJSONSerialization`的[`JSONObjectWithData`](http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html)函数. (4认同)

Ric*_*att 11

您可以使用块闭包从这样的方法传回多个值.-rrh

[self heyFunctionGiveMeBackTwoValuesFromThisFruitArray:@[@"apple", @"orange", @"banana", @"apple"] findThisFruit:@"apple" closureFunction:^(int fruitCount, NSString* fruitString)
{
    NSLog(@"Two values returned, int-fruitCount:%d, NSString-fruiteString:%@", fruitCount, fruitString);
}];

- (void)heyFunctionGiveMeBackTwoValuesFromThisFruitArray:(NSArray*)fruitsArray findThisFruit:(NSString*)findThisFruit closureFunction:(void (^)(int fruitCount, NSString *fruitString))passBackResultsUsingThisClosure
{
    NSInteger fruitsFound = 0;
    NSString* fruitsMessage = [NSString stringWithFormat:@"No %@ Found", findThisFruit];
    for (NSString* string in fruitsArray)
    {
        if ([string compare:findThisFruit] == NSOrderedSame)
        {
            fruitsFound++;
        }
    }
    if (fruitsFound > 0)
    {
        fruitsMessage = [NSString stringWithFormat:@"You have %@ on your list this many times:%d", findThisFruit, fruitsFound];
    }
    passBackResultsUsingThisClosure(fruitsFound, fruitsMessage);
}
Run Code Online (Sandbox Code Playgroud)

结果:返回了两个值,int-fruitCount:2,NSString-fruiteString:你的列表中有多次苹果:2


Jim*_*uls 10

由于您只能从C和C派生语言中的任何方法返回单个值,因此您只需返回表示所有其他值的单个值.这是您的示例代码正在执行的操作NSDictionary.

示例代码是正确的,即使它与常见的Objective-C样式有点相反.

你在头文件中声明的只是方法的声明,即:

@interface MyClass : NSObject
- (NSDictionary *)EndOfTurn:(int)varTurns withFatness:(int)varFatness;
@end
Run Code Online (Sandbox Code Playgroud)

在源文件中,然后:

@implementation MyClass
// code, as given above
@end
Run Code Online (Sandbox Code Playgroud)


bbu*_*bum 10

如果您需要从方法返回许多不同的东西,请将其封装到NSDictionary中,就像其他人建议的那样,或者只考虑定义一个类.您可以根据需要声明实例变量和属性以封装数据.

定义用于封装此类信息的类证明非常有效并且最大化灵活性.如果您需要重构应用程序以使数据集合获得新字段,需要保存以供日后使用,或者可能需要获取功能,则类将简化这些更改.

  • +1用于创建新课程.@Wayfarer:拥抱OOP的世界. (5认同)

Sen*_*ful 5

如果只需要返回原始值,则返回结构可能是最佳解决方案。您将获得编译时错误检查(例如,与可以尝试读取无效密钥的NSDictionary相反),而无需创建类涉及的所有代码/文件。

typedef struct myStruct {
  int varMoney;
  int varNumSheep;
  int varNumShepherds;
} myStruct;
Run Code Online (Sandbox Code Playgroud)

苹果也在其许多方法中使用了结构(例如CGPoint,CGRect)。

这不适用于对象的原因是因为ARC禁止这样做