根据多个条件创建数组

时间:2014-05-01 04:41:17

标签: objective-c logic

这更像是一个逻辑问题。我想看到不同的方法。 我正在尝试基于多个条件创建过滤器阵列。假设我有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];

对我来说很好看,但也许你可以想出一些与众不同的东西。我几乎无法想到任何其他方式。

2 个答案:

答案 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
}