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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:22:04