2

電卓のクラスは、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」で定義されているエラーの1つ(オーバーフローや精度の低下エラーなど)が発生した場合に例外を発生させて処理することです。

Webと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で除算すると、キャッチされない例外がスローされ、プログラムが終了します。わかりました、それは良いです。スローされた例外をどのようにキャッチし、構文的にどこでキャッチしますか?

4

1 に答える 1

0

@try@catchObjC リテラルを使用します。分割コードを@tryブロックでラップし、キャッチされた例外を@catchブロックでキャッチします。

于 2012-06-06T15:34:40.930 に答える