Класс калькулятора, по-видимому, является популярной отправной точкой для обучения Objective-C. Поэтому в моем классе «calculator» я определил свою функцию добавления, чтобы использовать метод decimalNumberByAdding: withBehavior:. «_behavior» определяется в методе init. Код описано показан ниже:Objective - C, используя NSDecimalNumberHandler и NSDecimalNumberBehaviors protocol
-(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', '- масштаб' и '- exceptionDuringOperation: Ошибка: leftOperand: rightOperand:' (Тем не менее, это не roundingMode и масштаб, уже указанный в моем NSDecimalNumberHandler выше, называемый «_behavior»?).
Мотивация использования этого протокола заключается в том, чтобы поднять и обработать исключение, если произошла одна из ошибок, как определено в «_behavior» (например, переполнение или потеря точности ошибки).
После поиска в Интернете и документации Apple пока не ясно, как использовать протокол NSDecimalNumberBehaviors, и правильно поднимать и обрабатывать ошибки, описанные выше в «_behavior» (реализация протокола, по-видимому, включает в себя избыточность при сравнении с объявлением '_behavior').
Каков правильный способ использования протокола NSDecimalNumberBehaviors и поднять и обработать ошибки, определенные в «_behavior»? Возможно, пример поможет большинству. Спасибо:)
--update:
После снова глядя на документацию, я теперь вижу, что 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 бросает неперехваченное исключение и завершает программу. Хорошо, это лучше. Как я могу поймать заброшенное исключение и синтаксически, где?
RTFM .. http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_6.html – Jay