Нулевая строка с [NSString stringWithFormat:] отображается как "(null)" - PullRequest
18 голосов
/ 12 марта 2010

У меня есть класс «Контакты» с двумя свойствами: 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];

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

Ответы [ 4 ]

58 голосов
/ 12 марта 2010

При условии, что вы в порядке с firstName<space> или <space>lastName:

NSString *fullName = [NSString stringWithFormat:@"%@ %@",
    contact.firstName ?: @"", contact.lastName ?: @""];

(a ?: b - это расширение GCC , которое означает a ? a : b, без оценки a дважды.)

7 голосов
/ 12 марта 2010

NSString *fullName = [NSString stringWithFormat:@"%@ %@", first ? first : @"", last ? last : @""];, конечно, немного более кратко, но в нем есть та же ошибка, что и в исходном коде: fullName будет «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;

для правильной работы.

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

Вот как я справился ...

NSString *lastName = (NSString *)ABRecordCopyValue(personRef, kABPersonLastNameProperty);
cell.text = [NSString stringWithFormat:@"%@%@",lastName?[NSString stringWithFormat:@"%@ ",lastName]:@"",(NSString *)ABRecordCopyValue(personRef, kABPersonFirstNameProperty)?:@""];
0 голосов
/ 08 января 2014

Вот как я это сделал. Он не такой компактный, как другие, но я чувствую его более читабельным (что всегда для меня важнее).

Преимущество также заключается в удалении конечных пробелов в начале и конце.

// 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]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...