2

在Objective C 中,我有一个对象,例如有Person很多字段firstName、、、、lastName...等等。这些字段类型是并且其中任何一个都可以是。phoneNumberaddresscityNSStringnil

现在我想将我的字段值连接到另一个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

4

5 回答 5

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];
    }
}
于 2013-12-09T04:12:09.023 回答
0

尝试创建NSMutableString类别

#import "NSMutableString+checkForNilObject.h"

@implementation NSMutableString (checkForNilObject)


-(void) appendNotNillObject:(NSString *) string
{
    if(string)
    {
       [self appendString:string];
    }
}
@end
于 2013-12-09T05:27:34.367 回答
0

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

通过尝试 for 循环结构,您可能会节省一些代码,但如果您正在构建只有几个字段的 NSArray,这真的不是要走的路,尤其是因为您不能将 nil 项放入其中

更好的方法是:

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];
    }
}
于 2013-12-09T04:08:38.093 回答
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];
于 2013-12-09T04:27:34.847 回答
0

您可以覆盖类的吸气剂Person

    @implementation Person

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

    @end

像这样,您可以在此处定义所有设置器。

于 2013-12-09T05:09:39.017 回答