创建一个 NSArray 来表示包含 nil 的值
Creating an NSArray to represent values that include nil
我有一个数据源方法,它要求 NSArray
个数字;其中一些可能是 nil
,但无论如何我都需要 return 每个值。
该方法可能如下所示:
- (NSArray *)configurationValues:(Configuration *)configuration {
....
return [NSArray arrayWithObjects:value1, value2, value3, value4, nil];
}
如果 value3
是 nil
,我必须 return {2, 3, (object is nil), 3}.
当然我会遇到异常,因为我无法插入 nil
对象。
我能做的是检查每个对象并插入一些虚拟数字或 NSNull
,但这对我来说似乎是样板,并不是很优雅。
我正在尝试为 NSArray
创建一个类别,它将所有 nil
值替换为其他值以避免异常:
@implementation NSArray (Nullable)
+ (instancetype)arrayWithObjectsSafe:(id)firstObj, ... {
NSMutableArray *array = [NSMutableArray array];
va_list args;
id object;
va_start(args, firstObj);
while((object = va_arg(args, id))) {
if (object) {
[array addObject:object];
} else {
// Insert dummy element // stuck here
[array addObject:[NSNull null]];
}
NSLog(@"OBJECT %@", object);
}
va_end(args);
return [NSArray arrayWithArray:array];
}
@end
我不太熟悉可变参数方法,我被困在这里是因为 while
循环跳过了 nil
值,所以最终数组只包含 [= 之前的元素13=].
我可以解决这个问题吗,或者是否有现有的方法让 NSArray
在尝试插入 nil
对象时不抛出异常?
好吧,那是行不通的。如果您的对象列表中有一个 NULL,您的循环将把它作为列表的末尾。它不会崩溃,但也不会添加 [NSNull null]。
检查和 value1 一样简单 ?: [NSNull null] 而不是 value1。
您的代码失败仅仅是因为您使用 nil
作为参数结束标记和参数之一。只需使用不同的参数结束标记。例如你可以定义:
const id END_MARKER (__bridge id)(void *)-1;
定义另一个常量,而不是 nil
(其值为 0)。将循环更改为:
while((object = va_arg(args, id)) != END_MARKER)
你的电话是:
[NSArray arrayWithObjects:value1, value2, value3, value4, END_MARKER];
并且您的代码有效。
HTH
我有一个数据源方法,它要求 NSArray
个数字;其中一些可能是 nil
,但无论如何我都需要 return 每个值。
该方法可能如下所示:
- (NSArray *)configurationValues:(Configuration *)configuration {
....
return [NSArray arrayWithObjects:value1, value2, value3, value4, nil];
}
如果 value3
是 nil
,我必须 return {2, 3, (object is nil), 3}.
当然我会遇到异常,因为我无法插入 nil
对象。
我能做的是检查每个对象并插入一些虚拟数字或 NSNull
,但这对我来说似乎是样板,并不是很优雅。
我正在尝试为 NSArray
创建一个类别,它将所有 nil
值替换为其他值以避免异常:
@implementation NSArray (Nullable)
+ (instancetype)arrayWithObjectsSafe:(id)firstObj, ... {
NSMutableArray *array = [NSMutableArray array];
va_list args;
id object;
va_start(args, firstObj);
while((object = va_arg(args, id))) {
if (object) {
[array addObject:object];
} else {
// Insert dummy element // stuck here
[array addObject:[NSNull null]];
}
NSLog(@"OBJECT %@", object);
}
va_end(args);
return [NSArray arrayWithArray:array];
}
@end
我不太熟悉可变参数方法,我被困在这里是因为 while
循环跳过了 nil
值,所以最终数组只包含 [= 之前的元素13=].
我可以解决这个问题吗,或者是否有现有的方法让 NSArray
在尝试插入 nil
对象时不抛出异常?
好吧,那是行不通的。如果您的对象列表中有一个 NULL,您的循环将把它作为列表的末尾。它不会崩溃,但也不会添加 [NSNull null]。
检查和 value1 一样简单 ?: [NSNull null] 而不是 value1。
您的代码失败仅仅是因为您使用 nil
作为参数结束标记和参数之一。只需使用不同的参数结束标记。例如你可以定义:
const id END_MARKER (__bridge id)(void *)-1;
定义另一个常量,而不是 nil
(其值为 0)。将循环更改为:
while((object = va_arg(args, id)) != END_MARKER)
你的电话是:
[NSArray arrayWithObjects:value1, value2, value3, value4, END_MARKER];
并且您的代码有效。
HTH