使用默认协议实现的Swift枚举

时间:2018-06-26 06:06:09

标签: ios swift core-data

我有多个与Core Data相关的枚举,例如:

enum ManagedItemProperties: String {
    case purchaseDate
    case productId
    case addons
}

我想为每个这些枚举创建一个协议,以生成一个NSSortDescriptorNSPredicate来通过对象的属性来获取对象。

是否可以编写如下协议:

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)
    }
}

2 个答案:

答案 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。获取原始字符串值要容易得多。