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

部分iOS框架如何在不使用@objc的情况下定义带可选要求的Swift协议?

Swift协议的可选要求:无需@objc的特殊情况

你说得太对了——在Swift里,并不是所有带可选要求的协议都需要依赖@objc标记,Swift标准库中的部分协议就自带这种能力,不过原理和我们自定义的@objc协议不太一样。

先给你理清楚核心区别:

  • 对于我们自己写的自定义协议,如果想让某个方法/属性是可选实现的,必须给协议加上@objc标记,再用optional关键字修饰成员。要是忘了加@objc,编译器就会直接报错,就像你提到的测试场景:

    protocol TestProtocol {
        optional func optionalMethod() // 这里会报错:'optional' can only be applied to members of an @objc protocol
    }
    

    这个错误完全符合预期,因为Swift原生协议本身不支持optional关键字,必须借助Objective-C的运行时才能实现。

  • 但Swift标准库中的一些协议,是通过默认实现来达到“可选要求”的效果的。比如Collection协议里的isEmpty属性,它已经有了基于count的默认实现,所以你自定义集合类型时,完全可以选择不手动实现isEmpty,编译器不会找你麻烦——这看起来和可选要求一样,但本质是协议提供了默认实现,不需要依赖@objc。

还有些标准库协议,会通过条件一致性来自动适配不同类型,让你感觉某些要求是可选的,但同样不需要@objc的参与。

总结一下:如果你要写自己的可选协议,@objc是必须的;但标准库已经帮我们做好了很多协议的“可选”支持,不用我们额外加标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:53:10