Строка Nil с [NSString stringWithFormat:] отображается как "(null)"
У меня есть класс "Контакт" с двумя свойствами: firstName и lastName.
Когда я хочу показать полное имя контакта, вот что я делаю:
NSString *fullName = [NSString stringWithFormat:@"%@ %@", contact.firstName, contact.lastName];
Но когда firstName и/или lastName установлены в nil, я получаю "(null)" в строке fullName. Чтобы предотвратить это, вот что я делаю:
NSString *first = contact.firstName;
if(first == nil) first = @"";
NSString *last = contact.lastName;
if(last == nil) last = @"";
NSString *fullName = [NSString stringWithFormat:@"%@ %@", first, last];
Кто-нибудь знает лучший/более сжатый способ сделать это?
Ответы
Ответ 1
Предполагая, что вы в порядке с firstName<space>
или <space>lastName
:
NSString *fullName = [NSString stringWithFormat:@"%@ %@",
contact.firstName ?: @"", contact.lastName ?: @""];
(a ?: b
является расширением GCC, которое означает a ? a : b
, не оценивая a
дважды.)
Ответ 2
NSString *fullName = [NSString stringWithFormat:@"%@ %@", first ? first : @"", last ? last : @""];
, конечно, немного более кратким, но он имеет ту же ошибку, что и ваш исходный код, который является полным именем, будет "firstName" или "lastName" (обратите внимание на пробелы), если тот или иной существовать. Таким образом, вы вынуждены писать код типа
NSMutableString* fullName = [NSMutableString string];
if( contact.firstName ) { [fullName appendString:contact.firstName]; }
if( contact.firstName && contact.lastName ) { [fullName appendString:@" "]; }
if( contact.lastName ) { [fullName appendString:contact.lastName]; }
return fullName;
чтобы он работал правильно.
Ответ 3
Вот как я прошел...
NSString *lastName = (NSString *)ABRecordCopyValue(personRef, kABPersonLastNameProperty);
cell.text = [NSString stringWithFormat:@"%@%@",lastName?[NSString stringWithFormat:@"%@ ",lastName]:@"",(NSString *)ABRecordCopyValue(personRef, kABPersonFirstNameProperty)?:@""];
Ответ 4
Вот как я это сделал. Он не такой компактный, как другие, но его читаемость я чувствую (что всегда очень важно для меня).
Он также имеет преимущество удаления конечных пробелов с начала и конца.
// Remove any nulls from the first or last name
firstName = [NSString stringWithFormat:@"%@", (firstName ? firstName : @"")];
lastName = [NSString stringWithFormat:@"%@", (lastName ? lastName : @"")];
// Concat the strings
fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
// Remove any trailing whitespace
fullName = NSString *newString = [oldString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];