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

Swift协议中返回闭包的@discardableResult标记失效问题问询

Swift协议中@discardableResult标记在返回闭包方法中失效问题解答

这是Swift 5.5及更早版本的已知编译器缺陷,并非你操作有误。

问题原因

  • 正常场景下,@discardableResult标记在协议声明中添加后,所有通过协议类型调用对应方法的场景都不会触发「返回值未使用」的警告。
  • 你遇到的是特定场景的编译器bug:当协议方法的返回值为函数/闭包类型时,Swift 5.5.1及更早版本的类型检查器会忽略协议上的@discardableResult标记,只有通过具体实现类调用时才能正确识别实现上的标记。
  • 该问题已经在Swift 5.7及之后的版本修复,升级Xcode或Swift工具链到对应版本即可解决。

临时兼容方案

如果暂时无法升级Swift版本,可以用以下两种方式规避警告:

  1. 调用时显式忽略返回值:
_ = second.foo()
  1. 给协议添加带@discardableResult标记的默认扩展实现,将原有协议实现要求更名:
protocol SomeProtocol {
    func fooImpl() -> () -> Void
}

extension SomeProtocol {
    @discardableResult func foo() -> () -> Void {
        return fooImpl()
    }
}

class SomeClass: SomeProtocol {
    func fooImpl() -> () -> Void {
        return {
            print("foo")
        }
    }
}

调整后所有调用foo()的场景,不管是用具体类型还是协议类型,都不会触发未使用警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:06:03