我有多个与Core Data相关的枚举,例如:
enum ManagedItemProperties: String {
case purchaseDate
case productId
case addons
}
我想为每个这些枚举创建一个协议,以生成一个NSSortDescriptor
和NSPredicate
来通过对象的属性来获取对象。
是否可以编写如下协议:
protocol ManagedProperty {
func sortDescriptor(ascending: Bool) -> NSSortDescriptor
func predicateEqual(to arg: CVarArg) -> NSPredicate
func predicate(_ booleanValue: Bool) -> NSPredicate
}
及其默认实现类似于:
extension ManagedProperty where ????? {
func sortDescriptor(ascending: Bool = true) -> NSSortDescriptor {
return NSSortDescriptor(key: ?????, ascending: ascending)
}
func predicateEqual(to arg: CVarArg) -> NSPredicate {
return NSPredicate(format: "SELF.%@ == %@", ?????, arg)
}
func predicate(_ booleanValue: Bool) -> NSPredicate {
return NSPredicate(format: "SELF.%@ == %d", ?????, booleanValue)
}
}
答案 0 :(得分:1)
是,协议扩展允许您为符合类型的代码提供默认的代码实现。但是,对于枚举,您最好编写一个协议并为每个枚举编写扩展以实现该协议,例如
extension ManagedItemProperties: ManagedProperty {
func sortDescriptor(ascending: Bool = true) -> NSSortDescriptor {
return NSSortDescriptor(key: ?????, ascending: ascending)
}
func predicateEqual(to arg: CVarArg) -> NSPredicate {
return NSPredicate(format: "SELF.%@ == %@", ?????, arg)
}
func predicate(_ booleanValue: Bool) -> NSPredicate {
return NSPredicate(format: "SELF.%@ == %d", ?????, booleanValue)
}
}
如果返回的谓词因枚举大小写而异,请在函数中使用switch语句,Swift将确保为每种情况包含一个代码路径。
答案 1 :(得分:0)
好吧,我决定将String
扩展为NSPredicate
。获取原始字符串值要容易得多。