Swift协议中返回闭包的@discardableResult标记失效问题问询
Swift协议中@discardableResult标记在返回闭包方法中失效问题解答
这是Swift 5.5及更早版本的已知编译器缺陷,并非你操作有误。
问题原因
- 正常场景下,
@discardableResult标记在协议声明中添加后,所有通过协议类型调用对应方法的场景都不会触发「返回值未使用」的警告。 - 你遇到的是特定场景的编译器bug:当协议方法的返回值为函数/闭包类型时,Swift 5.5.1及更早版本的类型检查器会忽略协议上的
@discardableResult标记,只有通过具体实现类调用时才能正确识别实现上的标记。 - 该问题已经在Swift 5.7及之后的版本修复,升级Xcode或Swift工具链到对应版本即可解决。
临时兼容方案
如果暂时无法升级Swift版本,可以用以下两种方式规避警告:
- 调用时显式忽略返回值:
_ = second.foo()
- 给协议添加带
@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
相关产品推荐
相关产品推荐

