繁体   English   中英

符合协议时的Swift类扩展

[英]Swift Class Extension Only When Conforming to Protocol

是否可以提供仅为符合协议的类添加功能的扩展? 我想要实现的功能是这样的:

protocol Identifiable {
  var id: String { get }
}

class Model {
  func report(data: String) {
    ...
  }
}

class Thing: Model, Identifiable {
  var id: String
  ...
}

class Place: Model, Identifiable {
  var id: String
  ...
}

extension (Model + Identifiable) {

  func identifiy() {
    report("\(self.id)")
  }

}

// Invalid: Model().identify()
Place().identify() // OK
Thing().identify() // OK

无法扩展协议本身,因为扩展需要访问model定义的方法。 扩展模型失败,因为id仅在子对象上定义。 扩展Model: Identifiable失败,因为Model不符合协议可Identifiable

您可以扩展Identifiable ,您只需要指定SelfModelModel子类:

extension Identifiable where Self: Model {
    func identifiy() {
        report(id) 
        // `id` is already a `String` so there's 
        // no need to use String Interpolation.
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM