Swift 组合谓词 LogicalType AND OR
Swift combining predicates LogicalType AND OR
如何在 Swift 谓词中组合混合 AND OR 条件。我有以下查询
Select * from tblTemp where dept == 1 && (subdept == 11 || subdept == 12)
我可以用相同的运算符写两个谓词,但不知道如何组合它们
let deptPredicate = NSPredicate(format: "dept == %@", 1)
let subdeptPredicate1 = NSPredicate(format: "subdept = %@", 11)
let subdeptPredicate2 = NSPredicate(format: "subdept = %@", 12)
let andPredicate = NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.and, subpredicates: [deptPredicate, subdeptPredicate1])
NSCompoundPredicate
是NSPredicate
的子类,意思是
结果是
NSCompoundPredicate(type:subpredicates:)
可用于另一种化合物
谓词。
但是请注意,%@
格式占位符需要一个 NSObject
实例:
let deptPredicate = NSPredicate(format: "dept == %@", 1 as NSNumber)
let subdeptPredicate1 = NSPredicate(format: "subdept = %@", 11 as NSNumber)
let subdeptPredicate2 = NSPredicate(format: "subdept = %@", 12 as NSNumber)
let orPredicate = NSCompoundPredicate(type: .or,
subpredicates: [subdeptPredicate1, subdeptPredicate2])
let andPredicate = NSCompoundPredicate(type: .and,
subpredicates: [deptPredicate, orPredicate])
或者,对整数使用 %ld
格式:
let deptPredicate = NSPredicate(format: "dept == %ld", 1)
// ... etc.
还有方便的初始化器:
let orPredicate = NSCompoundPredicate(orPredicateWithSubpredicates:
[subdeptPredicate1, subdeptPredicate2])
let andPredicate = NSCompoundPredicate(andPredicateWithSubpredicates:
[deptPredicate, orPredicate])
复合谓词对于组合一组动态的
运行时的条件。另一方面,如果只有 values 改变
那么您可以在谓词中简单地使用 "AND" 和 "OR"
格式字符串:
NSPredicate(format: "dept == %ld AND (subdept = %ld OR subdept = %ld)", 1, 11, 12)
最后请注意,您可以将 #keyPath
指令与
%K
占位符,让编译器填入正确的属性
名称(从而减少打字错误的机会):
let deptPredicate = NSPredicate(format: "%K == %ld", #keyPath(MyEntity.dept), 1)
如何在 Swift 谓词中组合混合 AND OR 条件。我有以下查询
Select * from tblTemp where dept == 1 && (subdept == 11 || subdept == 12)
我可以用相同的运算符写两个谓词,但不知道如何组合它们
let deptPredicate = NSPredicate(format: "dept == %@", 1)
let subdeptPredicate1 = NSPredicate(format: "subdept = %@", 11)
let subdeptPredicate2 = NSPredicate(format: "subdept = %@", 12)
let andPredicate = NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.and, subpredicates: [deptPredicate, subdeptPredicate1])
NSCompoundPredicate
是NSPredicate
的子类,意思是
结果是
NSCompoundPredicate(type:subpredicates:)
可用于另一种化合物
谓词。
但是请注意,%@
格式占位符需要一个 NSObject
实例:
let deptPredicate = NSPredicate(format: "dept == %@", 1 as NSNumber)
let subdeptPredicate1 = NSPredicate(format: "subdept = %@", 11 as NSNumber)
let subdeptPredicate2 = NSPredicate(format: "subdept = %@", 12 as NSNumber)
let orPredicate = NSCompoundPredicate(type: .or,
subpredicates: [subdeptPredicate1, subdeptPredicate2])
let andPredicate = NSCompoundPredicate(type: .and,
subpredicates: [deptPredicate, orPredicate])
或者,对整数使用 %ld
格式:
let deptPredicate = NSPredicate(format: "dept == %ld", 1)
// ... etc.
还有方便的初始化器:
let orPredicate = NSCompoundPredicate(orPredicateWithSubpredicates:
[subdeptPredicate1, subdeptPredicate2])
let andPredicate = NSCompoundPredicate(andPredicateWithSubpredicates:
[deptPredicate, orPredicate])
复合谓词对于组合一组动态的 运行时的条件。另一方面,如果只有 values 改变 那么您可以在谓词中简单地使用 "AND" 和 "OR" 格式字符串:
NSPredicate(format: "dept == %ld AND (subdept = %ld OR subdept = %ld)", 1, 11, 12)
最后请注意,您可以将 #keyPath
指令与
%K
占位符,让编译器填入正确的属性
名称(从而减少打字错误的机会):
let deptPredicate = NSPredicate(format: "%K == %ld", #keyPath(MyEntity.dept), 1)