部分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
相关产品推荐
相关产品推荐

