首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通用NSPredicate

通用NSPredicate
EN

Stack Overflow用户
提问于 2017-01-11 08:42:08
回答 1查看 258关注 0票数 1

我正在尝试创建一个返回NSPredicate的函数。

目前我有:

代码语言:javascript
运行
复制
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)]
}

似乎有点过火了。因此,我一直试图将它们合并在一起,并创建一个通用函数:

代码语言:javascript
运行
复制
func predicate<T: CVarArg>(value: String, op: String, predicate: T) -> [NSPredicate] {
    return [NSPredicate(format: "\(value) \(op) %@", predicate)]
}

除非TInt,否则这是可行的。为此,我需要使用%d。我试着加入这句话:

代码语言:javascript
运行
复制
let symbol = T is SignedInteger ? "%d" : "%@"

但这给了我一个错误:

...can仅用作泛型约束.

然后,我想我可以用一个where子句创建函数:

代码语言:javascript
运行
复制
func ... -> [NSPredicate] where T: SignedInteger { ... }

但我不知道如何让DateStringNSManagedObject接受它。

问题:

如何创建一个能够区分Int和“其他”的泛型函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-11 09:04:39

您可以使用早期的解决方案来解决这个问题,以便为不同的参数类型提供不同的实现:重载

代码语言:javascript
运行
复制
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)]
}

希望这能有所帮助。

祝好运。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41586175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档