Swift 5.10中extension A: A.Nested.Doable为何引发循环引用?
为什么Swift 5.10中
extension A: A.Nested.Doable会引发循环引用? 问题中的代码如下:
class Parent1 { } class Parent2 { } class A: Parent1 { } extension A { class Nested: Parent2 { } } extension A.Nested { protocol Doable { } } extension A: A.Nested.Doable { }
循环引用的核心原因
当A.Nested继承自Parent2时,编译器的类型解析流程会形成闭环:
- 要处理
extension A: A.Nested.Doable,必须先解析A.Nested.Doable的完整协议定义,这就需要先完成A.Nested这个嵌套类的类型解析 - 但
A.Nested作为带继承关系的嵌套类,编译器在处理它的继承逻辑时,需要先确认外围类A的完整类型信息 - 而
A的完整类型定义又依赖于A.Nested.Doable协议的解析结果,三者形成了循环依赖链,最终触发编译器的循环引用检测报错。
去掉A.Nested继承后无报错的原因
如果A.Nested不继承任何类型,它的定义不需要依赖外围类A的完整上下文,编译器可以先独立完成A.Nested和内部Doable协议的解析,之后再处理A遵守该协议的扩展,整个依赖链是线性的,不会形成循环。
内容的提问来源于stack exchange,提问作者Filippo
相关产品推荐
相关产品推荐

