【问题标题】:Swift Class Extension Only When Conforming to ProtocolSwift 类扩展仅在符合协议时
【发布时间】:2015-09-08 00:16:46
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    你可以扩展Identifiable,你只需要指定SelfModel,或者Model的子类:

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

    【讨论】:

    • 谢谢!我找不到正确的语法。感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多