我正在尝试创建一个返回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" : "%@"
但这给了我一个错误:
...can仅用作泛型约束.
然后,我想我可以用一个where
子句创建函数:
func ... -> [NSPredicate] where T: SignedInteger { ... }
但我不知道如何让Date
、String
和NSManagedObject
接受它。
问题:
如何创建一个能够区分Int
和“其他”的泛型函数?
发布于 2017-01-11 09:04:39
您可以使用早期的解决方案来解决这个问题,以便为不同的参数类型提供不同的实现:重载。
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)]
}
希望这能有所帮助。
祝好运。
https://stackoverflow.com/questions/41586175
复制相似问题