类型铸造,为什么它如此冗长?或者我做错了什么?

时间:2014-02-10 15:30:04

标签: ios objective-c

我有一个NSDecimalNumber和一个NSInteger。我想将前者乘以后者,所以我必须转换整数。在经过一些试验和错误之后,我就想到了这一点。

NSDecimalNumber *factor = (NSDecimalNumber*) [NSDecimalNumber numberWithInteger:myInteger];

感觉就像我真正开车回家:

  1. 您好,我想要一个NSDecimalNumber,我们称之为 factor
  2. 顺便说一下,只要你知道,我希望那是一个NSDecimalNumber,如果可能的话。
  3. 你能给我一张NSDecimalNumber吗?在这里,我将给你一个整数作为源。
  4. 它应该是这个冗长吗?或者我搞砸了某个地方?

2 个答案:

答案 0 :(得分:5)

(NSDecimalNumber*)类型转换是“必需的”,因为+numberWithInteger:是一个返回NSNumber对象的NSNumber方法。但是,这实际上会导致问题,因为它返回NSNumber个对象,一个NSDecimalNumber。 (How to use NSDecimalNumber?

要将整数转换为十进制数,只需执行以下操作:

NSDecimalNumber *factor = [NSDecimalNumber decimalNumberWithDecimal: [@(myInteger) decimalValue]];

它仍然相当冗长,但要牢记两件事:

  • Objective-C设计非常详细。
  • NSDecimalNumber不适用于基本整数运算,它适用于通常使用科学记数法表示的数字。

答案 1 :(得分:1)

您调用的API是NSNumber便利构造函数,它返回NSNumber - 不一定是NSDecimalNumber。便捷构造函数不需要返回消息类的类型,而是返回声明的返回类型的实例。由于NSDecimalNumberNSNumber的子类,因此在将NSNumber分配给NSDecimalNumber时需要明确的向下转发。

如果库编写者想要指定您的期望(返回您已发送消息的类的实例),则instancetype将用于返回类型。不幸的是,它是一个相当新的关键字,并不存在于它可能存在的所有地方。如果使用了instancetype,则不需要演员。

instancetype存在之前,一个简单的id就是惯例。对于id,在分配/初始化Objective-C类型的变量时,不需要强制转换并且不执行类型检查。例如:如果返回类型为NSArray * array = [NSString string];,则编译器不会标记id,但如果返回类型为instancetype,则会标记它。 NSMutableString * string = [NSMutableString string];将不会被标记,但如果+string的返回类型被声明为+ (NSString *)string;,则会标记它。