Что эквивалентно NSNotFound для поплавков

Что, если у меня есть метод, который возвращает CGFloat, и этот метод не может найти ожидаемое число, я хотел бы вернуть что-то вроде NSNotFound, но это NSInteger.

Какая лучшая практика для этого?


person bobmoff    schedule 12.12.2014    source источник
comment
Возможно, вам подойдет CGFLOAT_MAX или CGFLOAT_MIN.   -  person rmaddy    schedule 12.12.2014
comment
Предупреждение о DBL_MIN, FLT_MIN и CGFLOAT_MIN: возможно, вопреки здравому смыслу, они не считаются минимально возможным значением, а являются наименьшим положительным количество, которое может быть представлено этим типом. Если вам нужно самое отрицательное/минимальное значение, используйте -DBL_MIN, -FLT_MIN или -CGFLOAT_MIN.   -  person ipmcc    schedule 12.12.2014


Ответы (2)


Вы можете использовать не число (NaN).

См. nan(), nanf() и isnan().

Однако для этих задач, где нет четко определенного незначения (это хуже с целыми числами), я предпочитаю использовать следующую семантику метода:

- (BOOL)parseString:(NSString *)string
            toFloat:(CGFloat *)value
{
    // parse string here
    if (parsed_string_ok) {
        if (value)
            *value = parsedValue;
        return YES;
    }
    return NO;
}
person Droppy    schedule 12.12.2014
comment
Использование NaN в качестве контрольного значения имеет различные ловушки, например, если передать его в API, которые этого не ожидают, вы можете получить странные неожиданные результаты. CoreGraphics становится особенно несчастным (сбои и т. д.), если вы передаете ему NaN значений. Чтобы быть в безопасности, вам в конечном итоге придется проверять результат каждого вызова, который когда-либо мог вернуть NaN, и в этот момент вы могли бы просто сделать то, что предложил @Droppy, и использовать выходной параметр и возвращаемое значение BOOL. Каждый раз, когда я использовал NaN в качестве контрольного значения, мне хотелось, чтобы я этого не делал. - person ipmcc; 12.12.2014
comment
@ipmcc Спасибо за вклад. - person Droppy; 12.12.2014
comment
Я думаю, что Nan просто не подходит для iOS, так что это не ожидается, и вам не следует его использовать. - person iCaramba; 12.12.2014
comment
На самом деле я никогда не создавал свои собственные методы, которые принимают выходной параметр, но в данном случае это очень хорошо подходит. Спасибо! - person bobmoff; 13.12.2014
comment
@bobmoff Я бы, наверное, поставил 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;
}

Затем вы можете проверить, вернула ли функция ноль для вашего несуществующего значения.

person Accatyyc    schedule 12.12.2014
comment
Мне это нравится больше, чем мой ответ. - person Droppy; 12.12.2014
comment
Недостатком этого подхода, очевидно, является производительность, поскольку (большинство) NSNumbers выделяются в куче. - person ipmcc; 12.12.2014
comment
это было то, что я делал в первую очередь, но возвращение NSNumber кажется неправильным, когда метод вычисляет высоту ячейки, которая ЯВЛЯЕТСЯ CGFloat - person bobmoff; 13.12.2014
comment
Зачем вам нужно вычислять высоту для недопустимых ячеек? Мне кажется, они вообще не должны появляться. - person Accatyyc; 14.12.2014
comment
Я получаю кэшированную высоту для ячеек, и если высота ячейки еще не кэширована, я хочу, чтобы вызывающий абонент знал - person bobmoff; 15.12.2014