【问题标题】:Objective - C, Using NSDecimalNumberHandler and NSDecimalNumberBehaviors protocolObjective - C,使用 NSDecimalNumberHandler 和 NSDecimalNumberBehaviors 协议
【发布时间】:2012-06-10 01:02:34
【问题描述】:

对于那些学习 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 个方法: '- 舍入模式', '- 规模',和 '- exceptionDuringOperation:error:leftOperand:rightOperand:' (但是,roundingMode 和 scale 不是已经在我上面的 NSDecimalNumberHandler 中指定了,称为“_behavior”吗?)。

使用此协议的动机是如果发生“_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 会引发未捕获的异常并终止程序。好的,这样更好。如何捕获抛出的异常,以及在语法上在哪里?

【问题讨论】:

标签: objective-c ios protocols nsdecimalnumber raise


【解决方案1】:

使用@try@catch ObjC 文字。将您的除法代码包装在 @try 块中,并在 @catch 块中捕获捕获的异常。

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多