我试图理解泛型,因此我创建了一个泛型以返回[NSPredicate]
,但是现在我需要将它们做成两个,因此每当传递数字时,它将使用正确的函数。我应该如何更改它以便将其限制为仅一个功能?
基本上,我只需要传递String
,Int
和NSNumber
(以及RawRepresentable
,但我认为我不能将它们加在一起)< / p>
func createPredicate<T: CVarArg>(value: T) -> [NSPredicate] {
return [NSPredicate(format: "someProperty == %@", value)]
}
func createPredicate(value: Int) -> [NSPredicate] {
return [NSPredicate(format: "someProperty == %@", value as NSNumber)]
}
经过一番尝试,我得到了:
func createPredicate<T: CVarArg>(value: T) -> [NSPredicate] {
guard let number = value as? NSNumber else { return [NSPredicate(format: "someProperty == %@", value)] }
return [NSPredicate(format: "someProperty == %@", number)]
}
func createPredicate<T: RawRepresentable>(value: T) -> [NSPredicate] where T.RawValue: CVarArg {
return createPredicate(value: value.rawValue)
}
是否可以使其更紧凑/更短?