在目标C中,我有一个对象,例如Person
有很多字段firstName
,lastName
,phoneNumber
,address
,city
...等等。这些字段类型为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
值的情况?
答案 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