2010-03-12 7 views
18

J'ai une classe "Contact" avec deux propriétés: firstName et lastName. Quand je veux montrer, voici ce que je fais le nom complet d'un contact:La chaîne NIL avec [NSString stringWithFormat:] apparaît sous la forme "(null)"

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

Mais quand le prenom et/ou lastName est fixé à zéro, je reçois un « (null) » dans la chaîne fullName. Pour éviter cela, voici ce que je fais:

NSString *first = contact.firstName; 
if(first == nil) first = @""; 
NSString *last = contact.lastName; 
if(last == nil) last = @""; 
NSString *fullName = [NSString stringWithFormat:@"%@ %@", first, last]; 

ce que quelqu'un sait mieux/façon de faire plus concis cela?

Répondre

58

En supposant que vous êtes bien avec firstName<space> ou <space>lastName:

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

(a ?: b est un GCC extension qui signifie a ? a : b, sans évaluer a deux fois.)

+0

exemple Grand et lien utile – JSA986

+2

Vous pouvez utiliser cette approche sans avoir à faire des compromis sur la , juste procédez comme suit après fullName = [fullName stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; –

7

NSString *fullName = [NSString stringWithFormat:@"%@ %@", first ? first : @"", last ? last : @""]; est certainement un peu plus concis, mais a la même erreur que votre code original qui est que fullName serait "firstName" ou "lastName" (notez les espaces) si l'un ou l'autre n'existait pas. Ainsi, vous êtes obligé d'écrire du code comme

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; 

pour qu'il fonctionne correctement.

1

Voilà comment j'accompished ...

NSString *lastName = (NSString *)ABRecordCopyValue(personRef, kABPersonLastNameProperty); 
cell.text = [NSString stringWithFormat:@"%@%@",lastName?[NSString stringWithFormat:@"%@ ",lastName]:@"",(NSString *)ABRecordCopyValue(personRef, kABPersonFirstNameProperty)?:@""]; 
0

Voilà comment je l'ai fait. Ce n'est pas aussi compact que les autres, mais c'est plus lisible que je ressens (ce qui est toujours le plus important pour moi).

Il a également l'avantage de supprimer les espaces blancs de début et de fin.

// 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]];