Swift中如何通过属性隐式协议一致性使类遵循协议?
问题分析与解决方案
你的代码中,Foo 无法遵循 FooPresentable 的原因是:协议要求 bar 属性的类型为 BarPresentable,但 Foo 类中定义的 bar 是具体类型 Bar——尽管 Bar 已经通过扩展遵循了 BarPresentable,Swift 不会自动将具体类型的属性隐式转换为协议类型来满足协议的类型要求。
你可以仅通过告知编译器所有 Bar 实例都遵循 BarPresentable 来让 Foo 符合协议,不需要修改 Foo 类本身的属性定义,只需要在 Foo 的扩展中显式实现协议要求的 bar 属性即可:
protocol FooPresentable { var bar: BarPresentable { get } } protocol BarPresentable { } class Bar { } // 补充你代码中缺失的Bar类定义 class Foo { let bar: Bar } extension Bar: BarPresentable { } extension Foo: FooPresentable { // 显式实现协议的bar属性,将原Bar类型的bar向上转换为BarPresentable var bar: BarPresentable { self.bar } }
这段代码的核心是在 Foo 的协议扩展中,明确将原有的 Bar 类型属性返回为 BarPresentable 类型——由于我们已经通过扩展让 Bar 遵循了 BarPresentable,编译器会认可这个实现,认为 Foo 满足了 FooPresentable 的要求。
内容的提问来源于stack exchange,提问作者Reza Shirazian
相关产品推荐
相关产品推荐

