带有[NSString stringWithFormat:]的Nil字符串显示为“(null)”

时间:2010-03-12 15:04:18

标签: iphone string nsstring

我有一个'Contact'类,它有两个属性:firstName和lastName。 当我想显示联系人的全名时,我就是这样做的:

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

但是当firstName和/或lastName设置为nil时,我在fullName字符串中得到一个“(null)”。为了防止它,这就是我所做的:

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

有人知道更好/更简洁的方法吗?

4 个答案:

答案 0 :(得分:58)

假设你对firstName<space><space>lastName

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

a ?: bGCC extension,代表a ? a : b,未评估a两次。)

答案 1 :(得分:7)

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;

让它正常工作。

答案 2 :(得分:1)

以下是我的表现......

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

答案 3 :(得分:0)

这就是我做的。它不像其他人那么紧凑,但我觉得它更具可读性(这对我来说总是最重要的)。

它还具有从开头和结尾删除尾随空格的好处。

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