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

Swift扩展中静态运算符交换功能导致无限循环问题求助

Swift扩展重载+、*运算符导致无限循环的解决办法

问题原因

你遇到的无限循环是因为运算符重载后的互相调用触发递归死循环:

  • 调用3 + 4时,会进入重载的+函数,里面执行left * right,此时调用的是你重载后的*运算符
  • 重载的*函数里执行left + right,又会回到重载的+函数,如此反复递归,永远无法退出

解决方案

要解决这个问题,必须在重载的运算符函数里明确调用Swift标准库的原生运算符实现,而非直接使用+或*符号。可以通过Swift.+(left:right:)和Swift.*(left:right:)来访问原生运算符:

修正后的代码:

extension Int {
    static func + (left: Int, right: Int) -> Int {
        return Swift.*(left, right) // 调用原生乘法运算符
    }
    
    static func * (left: Int, right: Int) -> Int {
        return Swift.+(left, right) // 调用原生加法运算符
    }
}

print(3 + 4) // 输出12(对应原生3*4)
print(3 * 4) // 输出7(对应原生3+4)

调试技巧分享

可以在运算符函数中加入print(#function)来追踪函数调用流程,快速定位循环问题:

extension Int {
    static func + (left: Int, right: Int) -> Int {
        print(#function) // 打印当前函数名:static func +(left: Int, right: Int) -> Int
        return Swift.*(left, right)
    }
    
    static func * (left: Int, right: Int) -> Int {
        print(#function) // 打印当前函数名:static func *(left: Int, right: Int) -> Int
        return Swift.+(left, right)
    }
}

如果未修正代码,运行时会看到两个函数名反复打印,直观确认陷入了无限递归。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:49:52