Swift Package中Internal级Extension同名属性定义是否安全?是否违反ODR?
问题解答
完全安全,不会触发One Definition Rule(ODR)相关问题,原因如下:
首先是Swift的访问控制机制:你在Swift Package里定义的
internal级别的isNotEmpty计算属性,仅在该Package模块内部可见。当你在引入这个Package的外部代码中定义同名属性时,外部代码根本看不到Package里的那个属性,两者属于完全独立的符号,不存在冲突的基础。其次关于ODR规则:ODR本质是要求同一程序中同一个符号只能有一个定义,但Swift的模块隔离机制天然规避了这种问题。不同模块下的同名符号(只要访问控制限制了可见范围)会被编译器视为完全不同的定义,尤其是计算属性这类本质为方法实现的符号,各自模块的实现完全独立,不会被混淆。
举个实际场景:你在自己的项目代码里也给Collection扩展添加isNotEmpty属性,不管你设置它的访问级别是internal还是public,都不会和Package里的那个internal属性产生任何冲突——因为对你的代码来说,Package里的那个属性相当于“不存在”。
内容的提问来源于stack exchange,提问作者Byoungchan Lee
相关产品推荐
相关产品推荐

