我試圖創建一個函數,它返回NSPredicate
。通用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 only be used as a generic constraint...
然後,我以爲我可以創建一個where
子句功能:
func ... -> [NSPredicate] where T: SignedInteger { ... }
但那麼我不知道如何讓它接受Date
,String
和NSManagedObject
。
問:
如何創建一個通用的功能,可以在Int
與「他人」之間區別?
說實話,我沒有看到這種功能的用處。 'NSPredicate'(format:「key =%d」,123)''謂詞(value:「key」,op:「=」,predicate:123)的優點是什麼? –
@MartinR示例已被簡化。最初它是一個嵌套'enum'的'NSManagedObject'的協議,所以我可以更容易地創建一個謂詞。 –
請注意,整數參數的正確格式取決於整數類型的*大小*。在64位平臺上,NSPredicate(format:「key =%d」,Int.max)不會給出預期的結果,您應該對'Int'(== Int64)參數使用'%ld'。 –