结构体扩展实现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
相关产品推荐
相关产品推荐

