Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nspredicate 使用预先构建的字符串创建谓词_Nspredicate - Fatal编程技术网

Nspredicate 使用预先构建的字符串创建谓词

Nspredicate 使用预先构建的字符串创建谓词,nspredicate,Nspredicate,有没有一种方法可以直接从预格式化字符串创建nspredicate,而不调用predicateWithFormat?最后一个字符串类似于: (住院病人=1)和(出院!=)和((主治=史密斯)或(入院=史密斯)或(咨询包含[cd]SMITH)或(主治=琼斯)或(入院=琼斯)或(咨询包含[cd]JONES)) 可以,但需要稍微修改格式字符串 而不是做: [preds appendFormat:@" (attending = %@)", prov]; 您需要执行以下操作: [preds appendF

有没有一种方法可以直接从预格式化字符串创建nspredicate,而不调用predicateWithFormat?最后一个字符串类似于:

(住院病人=1)和(出院!=)和((主治=史密斯)或(入院=史密斯)或(咨询包含[cd]SMITH)或(主治=琼斯)或(入院=琼斯)或(咨询包含[cd]JONES))


可以,但需要稍微修改格式字符串

而不是做:

[preds appendFormat:@" (attending = %@)", prov];
您需要执行以下操作:

[preds appendFormat:@" (attending = '%@')", prov];
注意在
%@
修饰符周围使用单引号。谓词就是这样知道它是一个常量值的

然而,即使你走这条路,你仍然会被困在使用
predicateWithFormat:
,这似乎是你想要避免的。在格式字符串中如何使用
NSNull
也可能存在问题

我建议你做一些类似的事情:

NSArray *provs = [self.providerCode componentsSeparatedByString:@"|"];

NSMutableArray *providerPredicates = [NSMutableArray array];
NSPredicate *template = [NSPredicate predicateWithFormat:@"attending = $prov OR admitting = $prov OR consulting CONTAINS[cd] $prov"];
for (NSString *prov in provs) {
  NSDictionary *substitutions = [NSDictionary dictionaryWithObject:prov forKey:@"prov"];
  NSPredicate *p = [template predicateWithSubstitutionVariables:substitutions];
  [providerPredicates addObject:p];
}

NSPredicate *final = [NSPredicate predicateWithFormat:@"inpatient = 1 AND dischargedate != nil"];

if ([providerPredicates count] > 0) {
  NSPredicate *providers = nil;
  if ([providerPredicates count] > 1) {
    providers = [NSCompoundPredicate orPredicateWithSubpredicates:providerPredicates];
  } else {
    providers = [providerPredicates objectAtIndex:0];
  }

  final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:final, providers, nil]];
}
这是使用两种不同的整洁方式:

  • 谓词变量。您可以对格式字符串
    @“Attenting=$prov或Incidenting=$prov或consulting CONTAINS[cd]$prov”
    进行一次解析,然后每次使用不同的提供者时,只需用新值替换
    $prov
  • 构造复合谓词。您可以在
    NSCompoundPredicate
    上使用一些类方法将多个谓词转换为单个分组的
    谓词

  • @user680891很高兴听到这个消息!要将我的答案标记为已接受,请单击向上/向下投票箭头下方的复选标记。
    NSArray *provs = [self.providerCode componentsSeparatedByString:@"|"];
    
    NSMutableArray *providerPredicates = [NSMutableArray array];
    NSPredicate *template = [NSPredicate predicateWithFormat:@"attending = $prov OR admitting = $prov OR consulting CONTAINS[cd] $prov"];
    for (NSString *prov in provs) {
      NSDictionary *substitutions = [NSDictionary dictionaryWithObject:prov forKey:@"prov"];
      NSPredicate *p = [template predicateWithSubstitutionVariables:substitutions];
      [providerPredicates addObject:p];
    }
    
    NSPredicate *final = [NSPredicate predicateWithFormat:@"inpatient = 1 AND dischargedate != nil"];
    
    if ([providerPredicates count] > 0) {
      NSPredicate *providers = nil;
      if ([providerPredicates count] > 1) {
        providers = [NSCompoundPredicate orPredicateWithSubpredicates:providerPredicates];
      } else {
        providers = [providerPredicates objectAtIndex:0];
      }
    
      final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:final, providers, nil]];
    }