我有一个NSDecimalNumber和一个NSInteger。我想将前者乘以后者,所以我必须转换整数。在经过一些试验和错误之后,我就想到了这一点。
NSDecimalNumber *factor = (NSDecimalNumber*) [NSDecimalNumber numberWithInteger:myInteger];
感觉就像我真正开车回家:
它应该是这个冗长吗?或者我搞砸了某个地方?
答案 0 :(得分:5)
(NSDecimalNumber*)
类型转换是“必需的”,因为+numberWithInteger:
是一个返回NSNumber
对象的NSNumber
方法。但是,这实际上会导致问题,因为它返回NSNumber
个对象,不一个NSDecimalNumber
。 (How to use NSDecimalNumber?)
要将整数转换为十进制数,只需执行以下操作:
NSDecimalNumber *factor = [NSDecimalNumber decimalNumberWithDecimal: [@(myInteger) decimalValue]];
它仍然相当冗长,但要牢记两件事:
NSDecimalNumber
不适用于基本整数运算,它适用于通常使用科学记数法表示的数字。答案 1 :(得分:1)
您调用的API是NSNumber
便利构造函数,它返回NSNumber
- 不一定是NSDecimalNumber
。便捷构造函数不需要返回消息类的类型,而是返回声明的返回类型的实例。由于NSDecimalNumber
是NSNumber
的子类,因此在将NSNumber
分配给NSDecimalNumber
时需要明确的向下转发。
如果库编写者想要指定您的期望(返回您已发送消息的类的实例),则instancetype
将用于返回类型。不幸的是,它是一个相当新的关键字,并不存在于它可能存在的所有地方。如果使用了instancetype
,则不需要演员。
在instancetype
存在之前,一个简单的id
就是惯例。对于id
,在分配/初始化Objective-C类型的变量时,不需要强制转换并且不执行类型检查。例如:如果返回类型为NSArray * array = [NSString string];
,则编译器不会标记id
,但如果返回类型为instancetype
,则会标记它。 NSMutableString * string = [NSMutableString string];
将不会被标记,但如果+string
的返回类型被声明为+ (NSString *)string;
,则会标记它。