我正在尝试创建一个返回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)]
}

除非TInt,否则此操作有效。为此,我需要使用%d。我试着加上一句:
let symbol = T is SignedInteger ? "%d" : "%@"

但这给了我一个错误:
…只能用作泛型约束…
然后我想我可以用where子句创建函数:
func ... -> [NSPredicate] where T: SignedInteger { ... }

但我不知道如何让它接受DateStringNSManagedObject
问题:
如何创建可以区分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/

10-14 11:40