Математика с NSNumbers и int - PullRequest
5 голосов
/ 27 марта 2012

В target-c я пытаюсь оценить следующее выражение: _c = _f / 5 * 8; Оно говорит мне, что int и NSNumber являются недопустимыми аргументами для двоичного выражения.

Что не так?Я только начинаю работать с целью-c и какао, но знаком с php и основами и немного знаком с javascript.

Ответы [ 3 ]

11 голосов
/ 27 марта 2012

Objective-C имеет несколько различных структур для использования в вычислениях.Из его корней C происходят примитивные числа int s, float s, double s и т. Д., С которыми вы можете напрямую выполнять арифметические операции (+, -, *, /, так далее.).Это то, что вы хотите использовать.

На более высоком рычаге Objective-C также имеет NSNumber объекты, которые являются простыми обертками для примитивных типов, перечисленных выше.Они используются в Objective-C, где необходимо хранить примитивы (часто в других объектах, таких как массивы и словари, которые не принимают значения примитивов напрямую).Поскольку NSNumber s являются объектами, вы не можете выполнять с ними прямые арифметические операции, вы должны сначала извлечь их примитивные значения (например, используя intValue, чтобы получить целочисленное значение, или doubleValue, чтобы получить двойноеточность числа с плавающей точкой).Поскольку неясно, что представляют собой переменные в вашем вопросе, я не собираюсь рисковать предположить, что именно вы пытаетесь сделать (я не хочу вводить вас в заблуждение), но вы можете узнать больше о NSNumber в NSNumber Ссылка на класс .

Наконец, как упоминал Ричард, есть NSDecimalNumber с.Они почти никогда не используются, поскольку они либо просто не нужны (они предназначены для хранения чисел с чрезвычайно высокой точностью, намного превышающими возможности обычных примитивных значений), либо слишком сложны в использовании.Они также имеют свои собственные методы для выполнения арифметических операций, и, как правило, не имеют отношения к повседневному использованию.Опять же, если вам интересно, посмотрите подробнее NSDecimalNumber Ссылка на класс .

По большей части вы хотите использовать примитивные числа для своих вычислений.Когда вам нужно сохранить их, вы часто можете «вставлять» и «распаковывать» (сохранять и извлекать) из NSNumber объектов.

5 голосов
/ 27 марта 2012

Вы не можете делать эти вещи с объектами (NSNumber в этом случае).Таким образом, вам придется принять значение int / double / long / float.Я не знаю, какой из них является NSNumber, поэтому вот 2 решения, 1 будет работать:

_c = [_f doubleValue] / 5 * 8;

или:

_c = [NSNumber numberWithDouble:(_f / 5 * 8)];

Надеюсь, это поможет

0 голосов
/ 27 марта 2012

NSNumber s не может иметь математические символы, примененные к ним.В вашем случае ваш код на самом деле выглядел бы так, используя вместо этого NSDecimalNumber (у которого есть селекторы для умножения и деления чисел):

NSDecimalNumber *_c = nil;
NSDecimalNumber *_f = [NSDecimalNumber decimalNumberWithString:@"7"];

_c = [[_f decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"5"]] decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithString:@"8"]];

Это ужасно, но это то, как target-c работает с числами.Другой вариант - получить двойные значения для каждого из ваших целевых чисел, а затем умножить их.

...