这更像是一个逻辑问题。我想看到不同的方法。 我正在尝试基于多个条件创建过滤器阵列。假设我有4个布尔标准, 我将使用一个简单的切换按钮设置它们。
NSObject* A; BOOL booleanA TRUE;
NSObject* B;BOOL booleanB FALSE;
NSObject* C;BOOL booleanC TRUE;
NSObject* D;BOOL booleanD FALSE;
我想要实现的是最终得到一个具有TRUE布尔值的对象的数组,如:
NSArray: {A, C}
我打算用最简单的方法:
if(booleanA)[array addObject:A];
if(booleanB)[array addObject:B];
if(booleanC)[array addObject:C];
if(booleanD)[array addObject:D];
对我来说很好看,但也许你可以想出一些与众不同的东西。我几乎无法想到任何其他方式。
答案 0 :(得分:1)
您正在寻找算法解决方案。现在,您手动将4个(不相关的,虽然类似命名的)BOOL转换为1个数组。您只能在1:1匹配时编写算法,而不是N:1转换。因此,我建议您尝试将booleanA
放入容器booleanD
,而不是摆弄看似无关的变量。
如果将布尔值放入具有固定位置的数组中,使用索引或宏(booleans[B_INDEX]
),您可以编写算法将索引i
的真实性转换为字母{{ 1}},可以这么说。
如果使用小型集合类,您甚至可以摆脱处理数组和匹配索引。
我更喜欢一个集合类,以便使用这些东西的另一个类不会太臃肿。你展示的四条线看起来很相似,但由于BOOL没有任何共同之处,只有它们的名字,你还不能编写算法。封装像@ user3571918这样的算法将隐藏与您的调用类的匹配。此外,它隐藏了4行手动转换可能已变成30多行值对象或服务类的事实:)
使用更复杂的算法解决方案会有所回报吗?我认为如果您计划稍后添加更多交换机就是这种情况,这样您就不必更改调用类了它的数据表示已经扩展。
这是一个例子算法,我将其放入一个实用程序类中,以隐藏从其他类中修复元素数量这一事实。
A+i
汇编NSArray *booleans = @[@0, @1, @0, @1]; // array representation
NSArray *transformations = @[@"A", @"B", @"C", @"D"]; // matching utility
NSMutableArray *result = [NSMutableArray array];
[booleans savedArray enumerateObjectsUsingBlock:^(NSNumber *boolean, NSUInteger idx, BOOL *stop) {
BOOL isToggled = [boolean booleanValue];
id transformation = transformations[idx];
if (isToggled)
{
[result addObject:transformation];
}
}];
// result will be: @[@"B", @"D"];
的方式取决于您已有的代码。也许交换切换切换作为可变参数列表到实用方法工作,也许它会更简单。
答案 1 :(得分:0)
问题是布尔运算符不是对象。你可能最好将@ 0和@ 1用于你的目的,无论你需要将你的布尔值客观化以放置在NSArray中。解决方法是使用C数组,但是,由于您要求使用Objective-C更方便地获得答案,我将坚持使用。
基本上,我认为你的问题归结为“如何枚举NSArray”,并且有一些选择。 Here's关于NSArray的良好高级资源。还有其他方法可以做到这一点,尤其是enumerateWithBlock as described here previously的灵活性。
使用快速枚举,您可以使用类似于以下内容的代码:
NSArray* array = @[@0, @1, @0, @1];
for (NSNumber* number in array) {
if ([number isEqualToNumber:@0]) {
// action here
return;
}
// else action here
}