target-c: возвращаемое значение - PullRequest
1 голос
/ 15 февраля 2011

Я читаю «Программирование в Objective-C» Стивена Кочана (я n0000b).Все было для меня очевидно до упражнения 4-8.

Он просит меня изменить методы в классе «Аккумулятор», созданном ранее в этой главе, для «возврата» значения аккумулятора, когда один изиспользуются математические методы (в основном это калькулятор).Первоначально я понял, что это означает, что я хочу, чтобы программа отображала результат всякий раз, когда используется один из методов (+, -, *, /), поэтому я настроил его так, чтобы каждая строка отображала совокупный результат, а нетолько окончательный результат:

[deskCalc setAccumulator: 0.0];
[deskCalc add: 200.]; //the result is displayed
[deskCalc divide: 100.0]; //the result is displayed
[deskCalc subtract: 1.0]; //the result is displayed
[deskCalc multiply: 5]; //the result is displayed
NSLog (@"The result is %g", [deskCalc accumulator]);

Но после поиска решений других людей выясняется, что «возвращение значения Аккумулятора» означает нечто иное.

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

Спасибо!-Эндрю

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

Методы вычислений, которые вы используете в своем классе аккумуляторов, вероятно, сейчас выглядят примерно так:

- (void)add:(float)aFloat {
    result += aFloat;
    NSLog(@"%f", result);
}

Этот метод в своем текущем состоянии ничего не возвращает (void).Текущий итог выводится только на экран.Это хорошо для упражнения, но в реальных программах результат вычисления, вероятно, будет не очень полезным, если он будет отображаться на экране.Вместо этого вы, вероятно, захотите сделать что-то еще с результатом, поэтому вы хотите, чтобы метод его возвращал.Например, класс NSString имеет метод length.Этот метод не был бы очень полезен, если бы он печатал длину строки на экране.Вместо этого он возвращает длину, поэтому программа может сделать что-то полезное с этим значением (например, проверить правильность длины строки):

int length = [tweet length];
if (length > 140) {
    // display a useful error message
    ...
} else {
    // tweet it :)
    ...
}

Чтобы изменить методы калькулятора длячтобы вернуть что-то, вам (а) придется изменить сигнатуру метода, чтобы она возвращала значение, и (б) чтобы фактически вернуть это значение.

В сигнатуре метода просто измените тип возвращаемого значения на что-то другоенедействительным.В вашем примере правильным типом, вероятно, будет float (или любой другой тип, который калькулятор использует внутри для своего текущего результата).

- (float)add:(float)aFloat {
    ...
}

Чтобы фактически вернуть текущее значение, вы должны добавить оператор returnдобавьте конец вашего метода (перед закрытием })

return result;

(предполагается, что result - переменная экземпляра, содержащая текущий результат вычисления).

1 голос
/ 15 февраля 2011

Они просят вас изменить методы сложения, деления и вычитания, чтобы они возвращали значение аккумулятора по завершении выполненной операции.Я предполагаю, что ваши исходные методы add / split / etc определили возвращаемое значение (void), то есть они не возвращают никакого значения из вызова функции.В результате вы не могли выполнить выполнение, подобное следующему:

NSLog(@"Updated value: %g", [deskCalc substract: 1.0]);

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

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

Вот пример функции, которая возвращает строку NSString:

- (NSString *) getAString {
    return @"String being returned";
}

Вот как бы вы использовали эту функцию:

NSString *myString = [someObject getAString];

Надеюсь, это поможетвы в процессе обучения.

...