Swift中,公开返回的不透明类型的底层类型可为internal吗?
为什么返回不透明类型的公开函数可以使用内部类型?
我能理解如果答案是否定的情况,但如果答案是肯定的,希望能说明其工作原理。我提出这个问题是因为下面的代码没有出现编译错误:
// 这是一个内部类型 struct InternalType: CustomStringConvertible { var description: String = "Hi, there" var value: Int } // 这个公开函数返回一个不透明类型 public func createOpaqueType() -> some CustomStringConvertible { return InternalType(value: 42) }
从外部视角看,返回值只能当作CustomStringConvertible来用,但编译器难道不需要访问底层类型吗?
原理说明
答案是肯定的,编译器确实需要访问底层类型,但这仅限于编译当前模块的阶段,不需要把底层类型暴露给外部模块。
Swift的不透明类型(some Protocol)核心逻辑如下:
- 编译时,编译器会确定函数返回的具体底层类型(这里就是
InternalType),并生成对应的类型信息嵌入到二进制中。 - 对于外部模块来说,只能看到函数返回的是“符合
CustomStringConvertible协议的某个具体类型”,无法直接访问底层类型的内部成员(比如value属性),只能通过协议定义的接口(比如description)进行交互。 - 模块内部的编译器能访问
InternalType的定义,所以可以完成类型检查和代码生成;而外部模块调用该函数时,不需要知道底层类型的细节,只需要遵循协议的约束即可。
这种设计既保证了类型安全,又能隐藏内部实现细节,符合模块封装的原则。
内容的提问来源于stack exchange,提问作者Krishna murthy
相关产品推荐
相关产品推荐

