2014-12-12 4 views
3

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

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

+0

Возможно, 'CGFLOAT_MAX' или' CGFLOAT_MIN' будет работать для вас. – rmaddy

+1

Слово предупреждения о 'DBL_MIN',' FLT_MIN' и 'CGFLOAT_MIN': возможно, интуитивно, они не * то, что вы обычно считали бы« минимальным »возможным значением, а скорее« наименьшим », положительное * количество, которое может быть представлено этим типом ". Если вы хотите «самое отрицательное»/«минимальное» значение, используйте '-DBL_MIN',' -FLT_MIN' или '-CGFLOAT_MIN'. – ipmcc

ответ

3

Вы можете использовать не число (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; 
} 
+1

Использование 'NaN' в качестве значения дозорного устройства имеет различные подводные камни, например, если передать его в API, которые этого не ожидают, вы можете получить неожиданные неожиданные результаты. CoreGraphics становится особенно несчастным (сбои и т. Д.), Если вы передадите ему значения «NaN». Чтобы быть в безопасности, вам нужно проверить результат каждого вызова, который когда-либо мог вернуть «NaN», и в этот момент вы могли бы просто сделать то, что предложил @Droppy, и использовали параметр out и параметр «BOOL» возвращаемое значение. Каждый раз, когда я использовал «NaN» в качестве ценностного значения, я пришел к выводу, что этого не делал. – ipmcc

+0

@ipmcc Спасибо за вход. – Droppy

+0

Я думаю, что 'Nan' просто не« iOS », поэтому его не ожидается, и вы не должны его использовать. – iCaramba

3

Довольно чистый способ заключается в завернуть его в NSNumber:

- (NSNumber *)aFloatValueProbably 
{ 
    CGFloat value = 0.0; 
    if (... value could be found ...) { 
     return @(value); 
    } 
    return nil; 
} 

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

+0

Мне нравится это лучше, чем мой ответ. – Droppy

+0

Недостатком этого подхода является, очевидно, производительность, поскольку (большинство) NSNumbers выбраны в виде кучи. – ipmcc

+0

Это было то, что я делал первым, но возврат NSNumber не кажется правильным, когда метод вычисляет высоту ячейки, которая является CGFloat – bobmoff