对于那些学习 Objective-C 的人来说,计算器课似乎是一个流行的起点。所以在我的“计算器”类中,我定义了我的加法函数以使用“decimalNumberByAdding:withBehavior:”方法。'_behavior' 在 init 方法中定义。描述的代码如下所示:
-(id)init
{
if ((self = [super init]))
{
// Yes, raise errors (or exceptions)
// on all of these cases,
// and control the scale (number precision).
_behavior = [NSDecimalNumberHandler
decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:NSDecimalNoScale
raiseOnExactness:YES
raiseOnOverflow:YES
raiseOnUnderflow:YES
raiseOnDivideByZero:YES];
}
return self;
}
// My addition method
-(NSDecimalNumber *)addNum1:(NSDecimalNumber *)num1
andNum2:(NSDecimalNumber *)num2
{
NSDecimalNumber *result = [num1 decimalNumberByAdding:num2
withBehavior:_behavior];
return result;
}
要正确使用 NSDecimalNumberBehaviors 协议,需要实现 3 个方法:'-roundingMode'、'-scale' 和 '-exceptionDuringOperation:error:leftOperand:rightOperand:'(但是,上面的 NSDecimalNumberHandler 中没有指定 roundingMode 和 scale,称为'_行为'?)。
使用此协议的动机是如果出现“_behavior”中定义的错误之一(例如溢出或精度丢失错误),则引发并处理异常。
在搜索网络和 Apple 的文档后,尚不清楚如何使用 NSDecimalNumberBehaviors 协议,以及如何正确引发和处理上面“_behavior”中描述的错误(与“_behavior”相比,协议实现似乎包括冗余' 宣言)。
使用 NSDecimalNumberBehaviors 协议并引发和处理“_behavior”中定义的错误的正确方法是什么?也许一个例子最有帮助。谢谢 : )
- 更新:
再次查看文档后,我现在看到 NSDecimalNumberHandler 采用了 NSDecimalNumberBehaviors 协议。所以这意味着我只需要正确初始化和使用 NSDecimalNumberHandler 。
添加除法方法后(为了测试除以 0 异常),我看到代码看起来更像这样:
-(id)init
{
if ((self = [super init]))
{
// Yes, raise errors (or exceptions)
// on all of these cases,
// and control the scale (number precision).
_behavior = [NSDecimalNumberHandler alloc]
initWithRoundingMode:NSRoundPlain
scale:NSDecimalNoScale
raiseOnExactness:YES
raiseOnOverflow:YES
raiseOnUnderflow:YES
raiseOnDivideByZero:YES];
}
return self;
}
// My division method
-(NSDecimalNumber *)divideNum1:(NSDecimalNumber *)num1 byNum2:(NSDecimalNumber *)num2
{
NSDecimalNumber *result = [num1 decimalNumberByDividingBy:num2
withBehavior:_behavior];
return result;
}
实际上,除以 0 会引发未捕获的异常并终止程序。好的,这样更好。我如何捕获抛出的异常,以及在语法上,在哪里?