【问题标题】:iOS : NSString Evaluate String ExpressioniOS:NSString 评估字符串表达式
【发布时间】:2016-04-24 17:06:56
【问题描述】:

我有大型 XML 文件(几乎 1,27,000 条)银行记录。

在一种情况下,我们需要检查银行名称。例如

if(
        [title isEqualToString:@"ABHYUDAYA COOPERATIVE BANK LIMITED" ] ||
                   [title isEqualToString:@"ABU DHABI COMMERCIAL BANK" ] ||
                   [title isEqualToString:@"AHMEDABAD MERCANTILE COOPERATIVE BANK" ] ){
////Perform certain action
}

目前我们有 XML 结构,我们正在将这些庞大的数据解析为 NSString。所以我在 NSString 对象中得到了上面的示例数据。

如何评估上述示例的 NSString?在堆栈溢出时发现了很多使用 NSPredicateNSExpression 的示例。但是根据我对这些问题的理解,他们将处理数学表达式,例如4/3 * 2 等。我无法使用这些示例处理上述格式。

有没有办法在 NSString 和 if 条件中评估上述格式?

PS - 能够通过将数据转换为数据库但寻找字符串格式的 NSString 评估来解决上述问题。

【问题讨论】:

    标签: ios objective-c iphone nsstring


    【解决方案1】:

    如果只是为了让你的表达更好而不改变底层逻辑,你可以这样做:

    NSArray <NSString *> *bankNames = @[@"ABHYUDAYA COOPERATIVE BANK LIMITED" 
                                        @"ABU DHABI COMMERCIAL BANK",
                                        @"AHMEDABAD MERCANTILE COOPERATIVE BANK"];
    if ([bankNames contains:title]) {
        //Perform certain action
    }
    

    如果你坚持使用谓词,那么你应该这样做:

    NSArray <NSString *> *bankNames = @[@"ABHYUDAYA COOPERATIVE BANK LIMITED" 
                                        @"ABU DHABI COMMERCIAL BANK",
                                        @"AHMEDABAD MERCANTILE COOPERATIVE BANK"];
    NSPredicate *containsPredicate = [NSPredicate predicate:@"%K equals %@", @"SELF", title];
    BOOl matchesName = [bankNames filteredArrayUsingPredicate:predicate].count > 0;
    

    不过,我真的不明白你为什么要这么做。

    【讨论】:

    • 是的,这是一个不错的选择。我会将此标记为答案。有没有办法在 obj-c 中评估 NSString?
    • 你能详细说明你的意思吗?
    • 如果我得到 [title isEqualToString:@"ABHYUDAYA COOPERATIVE BANK LIMITED" ] || [title isEqualToString:@"ABU DHABI COMMERCIAL BANK" ] || [title isEqualToString:@"AHMEDABAD MERCANTILE COOPERATIVE BANK" ] 这种格式的数据。我可以在运行时使用 NSEXpression NSPredicate 来评估 String 吗?
    • 没有。在 OS X 上,您可能会链接 libclang 并在运行时进行编译和执行,但在 iOS 上没有这样的选项。
    • 不太清楚你想用 NSPredicate 和 NSExpression 实现什么,我最初的解决方案无法解决。不过,我更新了我的答案,希望这能回答你的问题
    【解决方案2】:

    让你有一个NSArray中的数据,命名为response,你想根据条件过滤它。

        NSArray *expectedBanks = [NSArray arrayWithObjects:
                                                          @"ABHYUDAYA COOPERATIVE BANK LIMITED" ,
                                                          @"ABU DHABI COMMERCIAL BANK" ,
                                                          @"AHMEDABAD MERCANTILE COOPERATIVE BANK", nil];
    
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bank IN %@", expectedBanks];
            NSArray *filtered  = [response filteredArrayUsingPredicate:predicate];
    

    上面的代码sn-p假设key为object,我们需要在Array中查找是“bank”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多