所以,让我们说我试图拼凑一个人的名字,我有我的变数:
@synthesize firstName = _firstName;
@synthesize middleName = _middleName;
@synthesize lastName = _lastName;
我有一个方法,我希望将这些变量与中间的空格连接起来,所以我使用:
NSArray *fullName = [NSArray arrayWithObjects:_firstName, _middleName, _lastName, nil];
self.fullName = [fullName componentsJoinedByString:@" "];
但是,如果_firstName
为undefined
或nil
,则其余变量不会添加到我的fullName
数组中。另一种解决方法是什么?
我想要解决的问题是找到一种有效的方法来添加多个字符串,以避免产生额外的空格。
答案 0 :(得分:1)
这是我要做的。在加载名称之前初始化名称时,将它们设置为空白字符串@“”。这样他们就永远不会是空的。
编辑:然后您可以使用下面的功能来构建它们
- (NSString *)fullName:(NSArray *)names
{
NSInteger c = 0;
NSString *fullName = @"";
for (NSString *name in names)
{
if ([name length] > 0)
{
if (c != 0)
{
fullName = [fullName stringByAppendingString:@" "];
}
fullName = [fullName stringByAppendingString:name];
c++;
}
}
return fullName;
}
答案 1 :(得分:1)
另一种选择是使用变量参数列表。缺点是您需要使用空终端列表(基本上是arrayWithObjects:
)或指定或有多少参数。
请参阅 - http://www.cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html。
它看起来像这样
-(NSMutableArray *) arrayWithNumber:(int) num withValues:(NSString *)firstArg,...
{
NSMutableArray *array = [[NSMutableArray alloc] init];
va_list args;
va_start(args, firstArg);
NSString *arg = firstArg;
for (int i = 0; i < num; i++)
{
// We have the first argument from va_start, so only grab the additional ones
if (i > 0)
arg = va_arg(args, NSString*);
if (arg!= nil)
{
[array addObject:arg];
}
}
return array;
}
-(void) testMethod
{
NSString *first = @"First";
NSString *second = nil;
NSString *third = @"Third";
NSMutableArray *a = [self arrayWithNumber:3 withValues:first,second,third];
NSLog(@"%@",a);
}
当然,对于你的情况,这可能是矫枉过正,但我想如果你正在处理与你所展示的不同的东西,我会把它扔出去。
答案 2 :(得分:0)
我会做这样的事情(使用文字):
NSArray *fullName= @[(_firstName ? _firstName : [NSNull null]),
(_middleName ? _middleName : [NSNull null]),
(_lastName ? _lastName : [NSNull null])
];
答案 3 :(得分:0)
所以我从@GregP和@ansible那里得到了一些灵感并写下了这个:
首先,我为每个变量分配了空字符串
-(id)init {
self = [super init];
_firstName = @"";
_middleName = @"";
_lastName = @"";
return self;
}
然后在我的方法中,我通过循环运行它们:
-(void)updateFullName {
NSMutableArray *fullName = [[NSMutableArray alloc] init];
NSArray *names = @[_firstName, _middleName, _lastName];
for (NSString *name in names) {
if ([name length]) {
[fullName addObject:name];
}
}
self.fullName = [fullName componentsJoinedByString:@" "];
}
这意味着我可以处理更多的变量,并解决self.fullName
最终值中额外空格的问题。
答案 4 :(得分:0)
我会在追加结果之前做一个循环或检查所有字符串并避免使用 componentsJoinedByString ,但是如果你真的想使用它,那么这段代码可以工作:
NSString *firstName = @"First";
NSString *middleName = nil;
NSString *lastName = @"Last";
NSMutableArray *fullNameArray = [NSMutableArray arrayWithArray:@[firstName ?: [NSNull null], middleName ?: [NSNull null], lastName ?: [NSNull null]]];
[fullNameArray removeObjectIdenticalTo:[NSNull null]];
NSString *fullName = [fullNameArray componentsJoinedByString:@" "];
NSLog(@"Full Name: '%@'", fullName);
结果是:
Full Name: 'First Last'
答案 5 :(得分:-1)
您可以通过使用空值初始化_firstName
,_middleName
和_lastName
来确保它们不为零。可能在viewDidLoad
中您可以执行以下操作:
_firstName = [NSString string];
_middleName = [NSString string];
_lastName = [NSString string];
答案 6 :(得分:-1)
尝试使用if
声明?
if (_firstName && _middleName && _lastName){
NSArray *fullName = [NSArray arrayWithObjects:_firstName, _middleName, _lastName, nil];
self.fullName = [fullName componentsJoinedByString:@" "];
} else {
//Behaviour you want if there is some missing.
}