Проверьте, является ли свойство экземпляра объекта пустым - PullRequest
1 голос
/ 02 июня 2011

Я пытаюсь реализовать приведенный ниже код безуспешно.По сути, я хочу установить отображаемое имя на thisPhoto.userFullName, если оно не пустое, в противном случае вместо него отображается thisPhoto.userName.

UILabel *thisUserNameLabel = (UILabel *)[cell.contentView viewWithTag:kUserNameValueTag];

NSLog(@"user full name %@",thisPhoto.userFullName);
NSLog(@"user name %@",thisPhoto.userName);
if (thisPhoto.userFullName && ![thisPhoto.userFullName isEqual:[NSNull null]] ) 
{
   thisUserNameLabel.text = [NSString stringWithFormat:@"%@",thisPhoto.userFullName];
}
else if (thisPhoto.userFullName == @"")
{
   thisUserNameLabel.text = [NSString  stringWithFormat:@"%@",thisPhoto.userName];
}

В настоящее время, даже если userFullName пусто, мой userName все еще не отображается на экране.

Ответы [ 7 ]

5 голосов
/ 02 июня 2011

Я бы предпочел

if([thisPhoto.userFullName length])
3 голосов
/ 03 июня 2011

Используйте -length.Это будет 0 всякий раз, когда строка nil или пустая строка @"".Как правило, вы хотите рассматривать оба случая одинаково.

NSString *fullName = [thisPhoto userFullName];
thisUserNameLabel.text = [fullName length]? fullName : [thisPhoto userName];
2 голосов
/ 03 июня 2011

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

[NSNull null] используется для хранения nil значений в классах коллекций (NSArray, NSSet, NSDictionary), которые не позволяют хранить в них nil значения.

Так что, если вы не проверяете значения, которые вы получаете из коллекции - нет смысла проверять [NSNull null]

2 голосов
/ 02 июня 2011

Если, как я полагаю, thisPhoto.userFullName - это NSString, вы можете попробовать

[thisPhoto.userFullName isEqualToString:@""]
1 голос
/ 03 июня 2011

«Пробел» означает @"", но также @" " или @"\n". Поэтому я бы обрезал userFullName и проверил длину этой строки.

if ([[thisPhoto.userFullName stringByTrimmingCharactersInSet:
        [NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) {

    // it's blank!
}
1 голос
/ 03 июня 2011
// this assumes userFullName and userName are strings and that userName is not nil
thisUserNameLabel.text = [thisPhoto.userFullName length] > 0 ? thisPhoto.userFullName : thisPhoto.userName;
1 голос
/ 02 июня 2011

Здесь я вижу несколько моментов

Первое - если ваша userFullName переменная экземпляра равна NSString*, тогда достаточно простого сравнения с nil:

if (thisPhoto.userFullName)

Если,конечно, вы явно задаете для него значение [NSNull null], что затем требует написанного вами условия.

Второе - сравнение строк выполняется методом isEqualToString:, поэтому второе условие должно быть переписано как:

if ([thisPhoto.userFullName isEqualToString:@""]) {
    ...
}

В-третьих, есть логический недостаток. Если ваш userFullName равен пустой строке (@""), код все равно попадет в первую ветвь.Т.е. пустая строка (@"") не равна [NSNull null] или простому нулю.Следовательно, вы должны писать в ветки - один для обработки пустой строки и nil, другой для нормального значения.Так что с небольшим рефакторингом ваш код становится таким:

thisUserNameLabel.text = [NSString stringWithFormat:@"%@",thisPhoto.userFullName];
if (!thisPhoto.userFullName || [thisPhoto.userFullName isEqualToString:@""]) {
    // do the empty string dance in case of empty userFullName.
}
...