2016-03-17 3 views
1

Это может звучать как глупый вопрос, но Apple предоставляет нам NSNotFound, но почему они не предоставили один под названием NSFound? Есть ли способ определить макрос NSFound самостоятельно?Можно ли определить макрос NSFound?

Поэтому я прошу все это в том, что для того, чтобы меня, чтобы проверить, если строка «содержит» некий символ я должен сделать двойной отрицательный IE

if ([XML rangeOfString:@"error" options:NSCaseInsensitiveSearch].location != NSNotFound) 
{ 
    //server is down 
} 
else 
{ 
    //server is up 
} 

По крайней мере, для меня это было бы так гораздо легче читать, если я мог бы просто сделать это вместо того, чтобы

if ([XML rangeOfString:@"error" options:NSCaseInsensitiveSearch].location == NSFound) 
{ 
//server is down 
} 
else 
{ 
//server is up 
} 

Если я хочу, чтобы определить NSFound или SAMFound, как бы я идти о выполнении этого?

+0

Поскольку rangeOfString возвращает местоположение строки. Какая польза от NSFound-константы, если вы фактически не получили место, где была найдена строка? – JAL

+0

@JAL, что не имеет смысла. Если rangeOfString возвращает местоположение строки, это хорошо, и это то, что я хочу. Если его не нашли, сделайте что-нибудь еще. Он будет идти в блоке else –

+1

Если вы должны были определить макрос для этого, учитывая множество возможных «найденных» случаев, вам действительно нужно просто сделать что-то вроде '#define NSFound (X) (X)! = NSNotFound ', что означает, что вам придется использовать его как' NSFound ([XML rangeOfString: @ "error" options: NSCaseInsensitiveSearch] .location) 'и лично, это менее читаемо и нестандартно! –

ответ

2

Ваша проблема действительно связана с методами шаблонов проектирования, такими как rangeOfString. Следуйте за ним - используйте одно возвращаемое значение для обоих действительных результатов, из которых есть много и признаков сбоя, из которых есть один. Вы можете проверить значение единственного отказа при сравнении с константой, NSNotFound в этом случае, но вы не можете точно проверить множество возможных значений с помощью простого сравнения - вместо этого вы используете «двойной отрицательный», который вам не нравится.

Если Вы находите это слишком некрасиво изменить его ... Может быть:

@interface NSString (SamExtras) 

- (BOOL) SAMcontainsString:(NSString *)string options:(NSStringCompareOptions)options; 

@end 

@implementation NSString (SamExtras) 

- (BOOL) SAMcontainsString:(NSString *)string options:(NSStringCompareOptions)options 
{ 
    return [self rangeOfString:string options:options].location != NSNotFound; 
} 

@end 

, который позволил бы использовать:

if ([XML SAMcontainsString:@"error" options:NSCaseInsensitiveSearch]) 
{ 
    //server is down 
} 
else 
{ 
    //server is up 
} 

с не двойным отрицанием. Вы можете написать категорию один раз и использовать ее во всех своих проектах.

HTH

+1

совершенный. Это именно то, что я искал. Спасибо! –

1

Двойной отрицательный не имеет последствий в коде, как в грамматике.

Причина они обеспечивают не нашли, в отличие от найденной версии, это просто не Найденное значение является единственным (якобы недействителен) значение, а все остальное является действительным. Поэтому проще определить это единственное недопустимое значение.

Кроме того, это имеет смысл (более эффективным, избегая двойного поиска и меньше кода) для хранения NSRange в локальной переменной для того, чтобы, во-первых тест на достоверность, а затем использовать значение:

NSRange range = [XML rangeOfString:@"error" options:NSCaseInsensitiveSearch]; 
if (range.location != NSNotFound) { 
    // Do thing with range 
} else { 
    // Complain 
} 
+0

Предполагаю, что вы считаете, что он хочет использовать диапазон для чего-то другого, кроме теста, но, на мой взгляд, хорошо указать. –

+0

@BrandonBuck Да, я делаю это предположение. – Droppy

+0

Все, что я пытаюсь сделать, это уйти от этого двойного отрицательного! = NSNotFound ... это просто перезаписывает то, что я уже знаю –

1

Там нет ничего плохого в том что бы ни оригинального теста:

if ([XML rangeOfString:@"error" options:NSCaseInsensitiveSearch].location != NSNotFound) { 

Если все, что вам нужно знать XML, содержит ли строка @"error", что тест отвечает на вопрос, и это совершенно legitimat e и идиоматический способ спросить об этом. Обратите внимание, что даже документация говорит вам, что containsString: - не что иное, как фронт для звонка rangeOfString:options:!

Если вы действительно хотите знать, что положительный вариант был бы, было бы проверить length возвращенного диапазона и посмотреть, если это то же самое, как length из @"error". length не найденного диапазона - 0.