You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体扩展实现Foo协议时遭遇无限递归警告的解决方法

解决结构体扩展实现协议时的无限递归警告

问题根源

你在Bar的扩展里实现的index是计算属性,在它的setter里执行self.index = newValue时,会再次触发这个计算属性的setter方法,形成无限递归,所以编译器抛出了"Function call causes an infinite recursion"的警告。

可行解决方案

因为Swift的结构体扩展不能直接添加存储属性,所以你需要在Bar的主定义里添加一个私有存储属性来保存index的实际值,再在扩展的协议实现中通过计算属性包装这个存储属性:

public protocol Foo {
    var index: Int { get set }
}

struct Bar {
    // 新增私有存储属性,用于维护index的实际值
    private var _index: Int = 0
    // ... 你的其他原有属性或方法
}

extension Bar: Foo {
    public var index: Int {
        get {
            // 这里可以根据需求返回自定义逻辑,比如原来的固定0,或者返回存储的值
            return _index
        }
        set {
            // 直接操作存储属性,避免递归调用setter
            _index = newValue
        }
    }
}

如果你的业务逻辑中index的get方法确实需要固定返回0,那setter可以留空(但这不符合get set协议的语义,协议要求属性是可读写的),不过更合理的做法还是用存储属性来维护状态,保证读写行为的一致性。


内容的提问来源于stack exchange,提问作者koen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:30:00