Что, если у меня есть метод, который возвращает CGFloat, и этот метод не может найти ожидаемое число, я хотел бы вернуть что-то вроде NSNotFound, но это NSInteger.
Какая лучшая практика для этого?
Что, если у меня есть метод, который возвращает CGFloat, и этот метод не может найти ожидаемое число, я хотел бы вернуть что-то вроде NSNotFound, но это NSInteger.
Какая лучшая практика для этого?
Вы можете использовать не число (NaN
).
Однако для этих задач, где нет четко определенного незначения (это хуже с целыми числами), я предпочитаю использовать следующую семантику метода:
- (BOOL)parseString:(NSString *)string
toFloat:(CGFloat *)value
{
// parse string here
if (parsed_string_ok) {
if (value)
*value = parsedValue;
return YES;
}
return NO;
}
NaN
в качестве контрольного значения имеет различные ловушки, например, если передать его в API, которые этого не ожидают, вы можете получить странные неожиданные результаты. CoreGraphics становится особенно несчастным (сбои и т. д.), если вы передаете ему NaN
значений. Чтобы быть в безопасности, вам в конечном итоге придется проверять результат каждого вызова, который когда-либо мог вернуть NaN
, и в этот момент вы могли бы просто сделать то, что предложил @Droppy, и использовать выходной параметр и возвращаемое значение BOOL
. Каждый раз, когда я использовал NaN
в качестве контрольного значения, мне хотелось, чтобы я этого не делал.
- person ipmcc; 12.12.2014
Nan
просто не подходит для iOS, так что это не ожидается, и вам не следует его использовать.
- person iCaramba; 12.12.2014
if (!value) return NO;
в качестве самого первого оператора, чтобы сохранить выполнение чего-то, что никогда не будет использоваться.
- person Droppy; 13.12.2014
Довольно чистый способ - обернуть его в NSNumber:
- (NSNumber *)aFloatValueProbably
{
CGFloat value = 0.0;
if (... value could be found ...) {
return @(value);
}
return nil;
}
Затем вы можете проверить, вернула ли функция ноль для вашего несуществующего значения.
CGFLOAT_MAX
илиCGFLOAT_MIN
. - person rmaddy   schedule 12.12.2014DBL_MIN
,FLT_MIN
иCGFLOAT_MIN
: возможно, вопреки здравому смыслу, они не считаются минимально возможным значением, а являются наименьшим положительным i> количество, которое может быть представлено этим типом. Если вам нужно самое отрицательное/минимальное значение, используйте-DBL_MIN
,-FLT_MIN
или-CGFLOAT_MIN
. - person ipmcc   schedule 12.12.2014