Тесты NSString не работают при тестировании, если расположение строки равно нулю - PullRequest
0 голосов
/ 21 февраля 2011

Хорошо, я знаю, что существует около тысячи вопросов такого типа, но ни одно из этих предложений, похоже, не работает, поэтому я вынужден задать еще один вопрос по этому поводу, поскольку это начинает ломать мои мысли.Теперь вопрос и контекст:

Я получаю местоположение от iPhone, но в случае, если местоположение недоступно или его часть недоступна, я переинициализирую строку в @ "" вместо уродливого @"(null)", потому что это местоположение, которое я загружаю на сервер.

Это распределение переменных:

        NSString *country = [NSString stringWithFormat:@"%@", placemarkFound.country];
        NSString *postalCode = [NSString stringWithFormat:@"%@", placemarkFound.postalCode];
        NSString *locality = [NSString stringWithFormat:@"%@", placemarkFound.locality];
        NSString *thoroughfare = [NSString stringWithFormat:@"%@", placemarkFound.thoroughfare];
        NSString *subThoroughfare = [NSString stringWithFormat:@"%@", placemarkFound.subThoroughfare];

Это тесты, которые я сейчас делаю:

        if (country == (id)[NSNull null] || country.length == 0) {
            NSLog(@"Entered first if for (null)");
            country = @"";
            postalCode = @"";
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (postalCode == (id)[NSNull null] || postalCode.length == 0) {
            postalCode = @"";
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (locality == (id)[NSNull null] || locality.length == 0) {
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (thoroughfare == (id)[NSNull null] || thoroughfare.length == 0) {
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (subThoroughfare == (id)[NSNull null] || subThoroughfare.length == 0) {
            subThoroughfare = @"";
        }

Второй:

        if (country == @"(null)") {
            NSLog(@"Entered first if for (null)");
            country = @"";
            postalCode = @"";
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (postalCode == @"(null)") {
            postalCode = @"";
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (locality == @"(null)") {
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (thoroughfare == @"(null)") {
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (subThoroughfare == @"(null)") {
            subThoroughfare = @"";
        }

Третий:

        if (!country) {
            NSLog(@"Entered first if for (null)");
            country = @"";
            postalCode = @"";
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (!postalCode) {
            postalCode = @"";
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (!locality) {
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (!thoroughfare) {
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (!subThoroughfare) {
            subThoroughfare = @"";
        }

Четвертый:

С классом:

static inline BOOL IsEmpty(id thing) {
return thing == nil
|| ([thing respondsToSelector:@selector(length)]
    && [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
    && [(NSArray *)thing count] == 0);
}
        if (IsEmpty(country)) {
            NSLog(@"Entered first if for (null)");
            country = @"";
            postalCode = @"";
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (IsEmpty(postalCode)) {
            postalCode = @"";
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (IsEmpty(locality)) {
            locality = @"";
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (IsEmpty(thoroughfare)) {
            thoroughfare = @"";
            subThoroughfare = @"";
        } else if (IsEmpty(subThoroughfare)) {
            subThoroughfare = @"";
        }

Так что есть две возможности, я делаю что-то ужасно неправильно или есть гораздо более простой способ сделать это.Я переместил переменные в этот вывод:

Variables before testing, country: (null)
postalCode: (null)

Спасибо за вашу помощь !!

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

Вместо country == @"(null)" вам нужно сделать: [country isEqual:@"(null)"] (или [country isEqualToString:@"(null)"]). Оператор == проверяет равенство указателей, но вы хотите проверить равенство значений объекта.

Edit:

Итак, второй путь - это, вероятно, путь (с фиксированной проверкой), но я бы порекомендовал отменить проверку:

if ([@"(null)" isEqual:myStringToTest]) { ... }

Таким образом, объект, для которого вызывается isEqual:, всегда будет действительным (статический объект, представляющий @"(null)").

1 голос
/ 21 февраля 2011

Читая ваш вопрос более внимательно, я заметил, что вы используете +[NSString stringWithFormat:] при назначении строк для ваших переменных:

NSString *country = [NSString stringWithFormat:@"%@", placemarkFound.country];
NSString *postalCode = [NSString stringWithFormat:@"%@", placemarkFound.postalCode];
NSString *locality = [NSString stringWithFormat:@"%@", placemarkFound.locality];
NSString *thoroughfare = [NSString stringWithFormat:@"%@", placemarkFound.thoroughfare];
NSString *subThoroughfare = [NSString stringWithFormat:@"%@", placemarkFound.subThoroughfare];

Это причина, по которой тест похож на

if (! country)

или

if (country == nil)

не работает: +[NSString stringWithFormat:] всегда возвращает не- nil строку.В вашем конкретном коде, если placemarkFound.country == nil, то ваша переменная country содержит строковое представление nil, а именно (null).

Поскольку вы сказали, что у вас нет особых причин использовать +stringWithFormat: и предполагая, что все свойства / члены структуры являются строками, вот одно решение вашей проблемы:

NSString *country = @"";
NSString *postalCode = @"";
NSString *locality = @"";
NSString *thoroughfare = @"";
NSString *subThoroughfare = @"";

if (placemarkFound.country) country = placemarkFound.country;
if (placemarkFound.postalCode) postalCode = placemarkFound.postalCode;
if (placemarkFound.locality) locality = placemarkFound.locality;
if (placemarkFound.thoroughfare) thoroughfare = placemarkFound.thoroughfare;
if (placemarkFound.subThoroughfare) subThoroughfare = placemarkFound.subThoroughfare;

Обратите внимание, что переменные содержат пустую строку, если их соответствующие свойства / члены структуры не отличаются от nil.

Для этой ситуации есть удобный ярлык.Вместо приведенного выше кода вы можете использовать следующий код, использующий троичный условный оператор:

NSString *country = (placemarkFound.country ? : @"");
NSString *postalCode = (placemarkFound.postalCode ? : @"");
NSString *locality = (placemarkFound.locality ? : @"");
NSString *thoroughfare = (placemarkFound.thoroughfare ? : @"");
NSString *subThoroughfare = (placemarkFound.subThoroughfare ? : @"");

Объясняя это:

NSString *country = (placemarkFound.country ? : @"");

означает следующее: если placemarkFound.country отличаетсяиз nil присвойте его переменной country.В противном случае присвойте пустую строку переменной country.

0 голосов
/ 21 февраля 2011

Вы тоже можете использовать это ... if( (NSNull *)country == [NSNull null] )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...