Таким образом, в основном, когда вы хотите иметь дело с этими объектами, вам нужно распаковать их ивары, а затем упаковать их обратно в новые объекты, предположительно 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];
...
есть ли изменяемые версии?
номер