DRY код: как вызвать реализацию из другого протокола - PullRequest
1 голос
/ 29 апреля 2020

У меня есть код, который я хочу DRY вверх, я не хочу повторять / поддерживать один и тот же код в нескольких местах.

protocol Programable {
    var log: String { get }
}

protocol Convertable {
    var status: String { get set }
}

extension Programable where Self: NSManagedObject {
    var log: String {
        return <managed object related stuff>
    }
}

extension Programable where Self: NSManagedObject, Self: Convertable {
    var log: String {
        return <managed object related stuff> + status
    }
}

Как я могу вызвать первое расширение log во втором расширении, поэтому мне не нужно повторять детали в коде?

1 Ответ

0 голосов
/ 29 апреля 2020

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

extension Programmable where Self: AnyObject {
  var log: String { where_Self_is_AnyObject_log }
  private var where_Self_is_AnyObject_log: String { "where Self: AnyObject" }
}

extension Programmable where Self: AnyObject & Convertible {
  var log: String { "\(where_Self_is_AnyObject_log) & Convertible" }
}
...