Подтвердить что ты не робот

Строка 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];

Кто-нибудь знает лучший/более сжатый способ сделать это?

4b9b3361

Ответ 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]];