我正在尝试创建一个返回NSPredicate
的函数。
目前我有:
func predicate(value: String, op: String, predicate: String) -> [NSPredicate] {
return [NSPredicate(format: "\(value) \(op) %@", predicate)]
}
func predicate(value: String, op: String, predicate: Int) -> [NSPredicate] {
return [NSPredicate(format: "\(value) \(op) %d", predicate)]
}
func predicate(value: String, op: String, predicate: NSManagedObject) -> [NSPredicate] {
return [NSPredicate(format: "\(value) \(op) %@", predicate)]
}
func predicate(value: String, op: String, predicate: Date) -> [NSPredicate] {
return [NSPredicate(format: "\(value) \(op) %@", predicate)]
}
有点过分了。所以我一直试图将它们合并在一起并创建一个通用函数:
func predicate<T: CVarArg>(value: String, op: String, predicate: T) -> [NSPredicate] {
return [NSPredicate(format: "\(value) \(op) %@", predicate)]
}
除非
T
是Int
,否则此操作有效。为此,我需要使用%d
。我试着加上一句:let symbol = T is SignedInteger ? "%d" : "%@"
但这给了我一个错误:
…只能用作泛型约束…
然后我想我可以用
where
子句创建函数:func ... -> [NSPredicate] where T: SignedInteger { ... }
但我不知道如何让它接受
Date
、String
和NSManagedObject
。问题:
如何创建可以区分
Int
和“其他”的泛型函数? 最佳答案
您可以使用以前的解决方案来解决这个问题,该解决方案针对不同的参数类型具有不同的实现:重载。
func predicate<T: CVarArg>(value: String, op: String, predicate: T) -> [NSPredicate] {
return [NSPredicate(format: "\(value) \(op) %@", predicate)]
}
func predicate(value: String, op: String, predicate: Int) -> [NSPredicate] {
return [NSPredicate(format: "\(value) \(op) %d", predicate)]
}
希望这有帮助。
祝你好运。
关于swift - 通用NSPredicate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41586175/