NSArray arrayWithObjects和未定义的变量

时间:2014-01-29 19:07:43

标签: ios objective-c

所以,让我们说我试图拼凑一个人的名字,我有我的变数:

@synthesize firstName = _firstName;
@synthesize middleName = _middleName;
@synthesize lastName = _lastName;

我有一个方法,我希望将这些变量与中间的空格连接起来,所以我使用:

NSArray *fullName = [NSArray arrayWithObjects:_firstName, _middleName, _lastName, nil];
self.fullName = [fullName componentsJoinedByString:@" "];

但是,如果_firstNameundefinednil,则其余变量不会添加到我的fullName数组中。另一种解决方法是什么?

我想要解决的问题是找到一种有效的方法来添加多个字符串,以避免产生额外的空格。

7 个答案:

答案 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. 
}