浏览对象的字段

时间:2013-12-09 04:01:58

标签: objective-c for-loop nsnull

在目标C中,我有一个对象,例如Person有很多字段firstNamelastNamephoneNumberaddresscity ...等等。这些字段类型为NSString,其中任何一种都可以是nil

现在我想在另一个NSString

中连接我的字段值
Person *p = ...
NSMutableString *s = [[NSMutableString alloc] init];
for (NSString *field in @[p.firstName, p.lastName, p.phoneNumber,
                          p.adress, p.city, ....more fields...]) {
    if ([field length] > 0) {
        [s appendFormat:@"%@\n", field];
    }
}

问题是,只要其中一个字段为nil,此代码就会崩溃。我有例外:

[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object 
from objects[0]'

我如何处理nil循环中for值的情况?

5 个答案:

答案 0 :(得分:3)

我同意@ TomPace的帖子,对于这个小编号,我会做一个简单的if / else。

但是,有时您可能需要遍历字段列表。

盲目地将值拉入数组是一个坏主意,因为您可能尝试将nil值插入数组中。在这种情况下,最好将字段名称作为字符串放入键数组中,并使用valueForKey:遍历列表以访问值。我可能会将keys列表存储在可以再次使用的其他位置。

Person *p = ...
NSMutableString *s = [[NSMutableString alloc] init];

NSArray *keys = @[@"firstName", @"lastName", @"phoneNumber", @"adress", @"city"];

for (NSString *key in keys) 
{
    NSString *value = [p valueForKey:key];
    if ([value length] > 0) {
        [s appendFormat:@"%@\n", value];
    }
}

答案 1 :(得分:0)

对于这么小的字段选择,不要使用for循环。

您可能通过尝试for循环结构来保存一些代码,但如果您只使用少量字段构建NSArray,那么实际上并不是这样,尤其是因为不能把零项目放进去

更好的方法是:

Person *p = ...
NSMutableString *s = [[NSMutableString alloc] init];
if ([p.firstName length] > 0)   [s appendFormat:@"%@\n", p.firstName];
if ([p.lastName length] > 0)    [s appendFormat:@"%@\n", p.lastName];
if ([p.phoneNumber length] > 0) [s appendFormat:@"%@\n", p.phoneNumber];
if ([p.adress length] > 0)      [s appendFormat:@"%@\n", p.adress];
if ([p.city length] > 0)        [s appendFormat:@"%@\n", p.city];

原始问题用大量字段更新后,

编辑。 就像@BergQuester所说的那样,支持更大,任意一组字段的方法是使用KVO样式的检查。

NSArray *fieldNames = @[@"firstName", @"lastName", @"phoneNumber", ....more fields...];
NSString *field;
for (NSString *fieldName in fieldNames) {
    field = [p valueForKey:fieldName];
    if ([field length] > 0 ) {
        [s appendFormat: @"%@\n", field];
    }
}

答案 2 :(得分:0)

Person *person = [[Person alloc] init];
person.firstName = nil;
person.lastName = @"lastName";

NSMutableString *s = [[NSMutableString alloc] init];
[s appendFormat:@"%@\n", person.firstName == nil?@"":person.firstName];
[s appendFormat:@"%@\n",  person.lastName == nil?@"":person.lastName];

答案 3 :(得分:0)

您可以覆盖类Person的getter。

    @implementation Person

    - (NSString *)firstName{
        if (_firseName == nil)
             _firstName = @"";
        return _firstName;
    }
///....Other setters    

    @end

像这样你可以在这里定义所有的设置者。

答案 4 :(得分:0)

尝试创建NSMutableString类别

#import "NSMutableString+checkForNilObject.h"

@implementation NSMutableString (checkForNilObject)


-(void) appendNotNillObject:(NSString *) string
{
    if(string)
    {
       [self appendString:string];
    }
}
@end