Перечисление Swift с реализацией протокола по умолчанию - PullRequest
0 голосов
/ 26 июня 2018

У меня есть несколько перечислений, связанных с Core Data, например:

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

Я хочу иметь протокол для каждого из этих перечислений, чтобы генерировать NSSortDescriptor и NSPredicate s для выборки объектов по их свойствам,

Можно ли написать протокол вроде:

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 голосов
/ 11 июля 2018

Хорошо, я остановился на расширении до String, которое возвращает NSPredicate с.Намного проще получить необработанное строковое значение.

0 голосов
/ 26 июня 2018

Да , расширения протокола позволяют предоставлять реализации кода по умолчанию для соответствующих типов.Однако, с перечислениями вам, вероятно, лучше написать один протокол и написать расширение для каждого перечисления для реализации этого протокола, например

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 обеспечат включение пути кода для каждого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...