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