Хотите знать, как работать с объектами nsnumber в арифметической операции? - PullRequest
3 голосов
/ 12 января 2010

Я видел эту тему, но хотел подтвердить:

Как преобразовать объекты NSNumber для вычислительных целей?

Так что, в основном, когда вы хотите иметь дело с этими объектами, вам нужно распаковать их ивары и затем упаковать их обратно в новые объекты, предположительно NSNumbers?

Это кажется слабым (и сильная боль в спине, нет?).

Как вы, ребята, работаете с ними?

Вы избегаете их? Подкласс их? есть ли изменяемые версии?

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

Спасибо

Ник

Ответы [ 3 ]

6 голосов
/ 12 января 2010

Таким образом, в основном, когда вы хотите иметь дело с этими объектами, вам нужно распаковать их ивары, а затем упаковать их обратно в новые объекты, предположительно NSNumbers?

Да. (Между прочим, вызов doubleValue означает не просто распаковать ivar. Там также могут быть некоторые преобразования.)

Это кажется слабым (и сильная боль в спине, нет?).

Этот «бокс» необходим, потому что сами по себе примитивные числа не поддерживают схему подсчета рефлексов в Objective-C (Foundation.framework). Например, вы должны пометить число как NSNumber, чтобы сохранить их в NSArray.

Вы избегаете их?

Вы не можете.

Подкласс их?

Вы не должны, но если вам нужно, следуйте советам:

  • Как и в любом кластере классов, если вы создаете подкласс NSNumber, вы должны переопределить примитивные методы его суперкласса, NSValue. Кроме того, существует ограниченный набор возвращаемых значений, которые ваша реализация метода NSValue objCType может возвращать, чтобы воспользоваться преимуществами абстрактных реализаций не примитивных методов. Допустимые возвращаемые значения: «c», «C», «s», «S», «i», «I», «l», «L», «q», «Q», «f» и «г».

Если вам нужно только добавить несколько удобных методов, например, -numberByAddingNumber:, используйте категорию :

@implementation NSNumber (MyExtension)
-(NSNumber*)numberByAddingNumber:(NSNumber*)another {
   double myVal = [self doubleValue];
   double anotherVal = [another doubleValue];
   return [NSNumber numberWithDouble:myVal + anotherVal];
}
@end
...
NSNumber* a, *b;
...
NSNumber* c = [a numberByAddingNumber:b];
...

есть ли изменяемые версии?

номер

3 голосов
/ 12 января 2010

Я избегаю NSNumbers, когда мне придется выполнять арифметику с переменной. На самом деле, я всегда избегаю их, если не собираюсь внедрять их в базовые данные или что-то в этом роде.

2 голосов
/ 22 ноября 2012

Теперь, когда в новейшей версии компилятора clang есть Objective-C Literal (версия 3.2, вышла с Xcode 4.6 и также может быть собрана из исходного кода), вы можете делать такие вещи как @ 42 и @ (7 + 35) на «ящик» NSNumbers.

...