Swift中Module的含义解析及跨文件子类化疑问解答
嘿,这个问题问到点子上了,我来给你把Swift里的Module讲明白:
1. 到底什么是Module?
在Swift里,Module就是一个独立的编译单元——可以理解为你正在开发的整个App项目、一个Framework库,或者一个Swift Package。它是代码被编译、打包的基本单位,每个Module都有自己独立的命名空间,不同Module的代码默认是相互隔离的。
2. 你的两个文件属于同一个Module吗?
答案是肯定的!只要你的file1.swift和file2.swift是放在同一个Xcode项目(或者同一个Target、同一个Swift Package里),它们就属于同一个Module。这就是为什么你能在file2里让C继承A:
- 哪怕你没给A加任何访问修饰符,Swift默认的
internal级别本来就允许同一个Module内的代码访问、继承; - 就算你把A设为
public,只要是同一个Module里的类,依然可以继承它(官方说明里的“仅能在其定义所在的Module内被继承”就是这个意思)。
3. 导入UIKit和Module归属没关系
你在两个文件里都写了import UIKit,只是把苹果的UIKit这个外部Module的代码引入到当前文件中使用而已——这完全不影响你自己的两个文件属于哪个Module。UIKit是独立的系统Module,你的file1和file2属于你自己的项目Module,两者是相互独立的。
官方规则再明确下
具有public访问级别或更严格访问级别的类,仅能在其定义所在的Module内被继承;具有public访问级别或更严格访问级别的类成员,仅能在其定义所在的Module内被子类重写。
举个反例帮你理解:如果把A放到一个单独的Framework(比如叫MyUtils)里,那这个Framework就是一个新的Module。这时候你在主App项目里想让C继承MyUtils里的public类A,就会报错——因为跨Module了,只有把A的访问级别改成open(Swift专为跨Module继承设计的级别),才能实现跨Module继承。
内容的提问来源于stack exchange,提问作者John

