Возврат нескольких значений из метода в Objective C

Embedded.com содержит запись из 3 частей, в которой реализован простой планировщик реального времени:

В отличие от других ответов, этот создан в виде учебника:

[ ...] в литературе мы не нашли документов, объясняющих, как реализовать новую политику планирования для Linux.

[...]

В этом документе в подробном описании [sic] мы представили все шаги, необходимые для реализации новой политики планирования.

[...]

Это простая реализация этого алгоритма планирования. Однако сложные вопросы, такие как прерывания, таймеры и многопроцессорные системы, если упомянуть некоторые, выходят за рамки этой статьи.

26
задан Jim Puls 7 November 2009 в 04:39
поделиться

3 ответа

Поскольку вы можете вернуть только одно значение из любого в языках C и C-производных, вам просто нужно вернуть одно значение, которое представляет все ваши другие значения. Это то, что ваш пример кода делает с NSDictionary .

Образец кода правильный, даже если он немного противоречит общепринятому стилю Objective-C.

То, что вы объявляете в файле заголовка это просто объявление метода, то есть:

@interface MyClass : NSObject
- (NSDictionary *)EndOfTurn:(int)varTurns withFatness:(int)varFatness;
@end

В исходном файле, тогда:

@implementation MyClass
// code, as given above
@end
10
ответ дан 28 November 2019 в 06:05
поделиться

Если у вас есть так много разных вещей, которые нужно возвращать из метода, либо инкапсулируйте их в NSDictionary, как предлагали другие, либо подумайте о том, чтобы просто определить класс. Вы можете объявить переменные экземпляра и свойства для инкапсуляции данных, если это необходимо.

Определение класса для инкапсуляции такой информации оказывается довольно эффективным и максимизирует гибкость. Если вам необходимо провести рефакторинг вашего приложения таким образом, чтобы в коллекции данных появились новые поля, которые необходимо сохранить на будущее или, возможно, потребуется расширить функциональность, класс упростит эти изменения.

10
ответ дан 28 November 2019 в 06:05
поделиться

А что насчет передачи значений в качестве указателей?

Например:

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

Затем вы можете вызвать его следующим образом:

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"

Изменить:

Это одинаково хорошо работает с объектами. Вы часто будете видеть это при работе с объектами NSError :

NSError *error = nil;
[anObject doSomething:foo error:&error];

Может быть реализовано как:

- (void) doSomething:(id)terrible error:(NSError **)error {
  if ([terrible isEqual:reallyBad]) {
    if (error != nil) { *error = [NSError errorWithDomain:@"domain" code:42 userInfo:nil]; }
  }
}
64
ответ дан 28 November 2019 в 06:05
поделиться