[英]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
,您只需要指定Self
是Model
或Model
子类:
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.