gpt4 book ai didi

objective-c - 创建一个 NSArray 来表示包含 nil 的值

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:02 27 4
gpt4 key购买 nike

我有一个数据源方法,它要求一个 NSArray 的数字;其中一些可能是 nil,但无论如何我都需要返回每个值。

该方法可能如下所示:

- (NSArray *)configurationValues:(Configuration *)configuration {
....
return [NSArray arrayWithObjects:value1, value2, value3, value4, nil];
}

如果 value3nil,我必须返回 {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 值,所以最终数组只包含元素在 nil 之前。

我可以解决这个问题吗,或者是否有现有的方法让 NSArray 在尝试插入 nil 对象时不抛出异常?

最佳答案

您的代码失败仅仅是因为您将 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

关于objective-c - 创建一个 NSArray 来表示包含 nil 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35777150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com