0Pricing
Swift Academy · 课时

some P(不透明结果类型):隐藏具体类型

返回 some P ,在承诺符合 P 的同时隐藏具体返回类型;调用方可获得静态类型性能,而无需暴露实现细节。

some P(不透明结果类型):隐藏具体类型 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 3 节课。

为什么使用不透明结果类型?

不透明结果类型使用 some P 将具体类型隐藏在协议之后。对于该函数来说,具体类型是固定的,但调用方只能看到协议提供的接口。

  • 无需牺牲静态性能即可实现封装
  • 非常适合工厂和类似 DSL 的接口

基本的不透明工厂

makeUnitCircle() 返回 some Shape。调用方可以调用 area(),但不能依赖具体类型。

protocol Shape {
    func area() -> Double
}
struct Circle: Shape {
    let r: Double
    func area() -> Double { .pi * r * r }
}
struct Square: Shape {
    let s: Double
    func area() -> Double { s * s }
}

// Opaque factory: callers know it's a Shape, not which one
func makeUnitCircle() -> some Shape {
    Circle(r: 1.0)    // concrete type is hidden
}

let sh = makeUnitCircle()
print(String(format: "%.2f", sh.area()))  // 3.14

每个函数固定

隐藏类型对于每个函数都是固定的。另一个返回 some Shape 的函数可能隐藏不同的具体类型。

// Each function using "some Shape" chooses one hidden concrete type.
// Within the same function, it must always be the same concrete type.
func makeSquare(side: Double) -> some Shape {
    Square(s: side)   // fixed to Square for this function
}

let a = makeUnitCircle()
let b = makeUnitCircle()
print(a.area() == b.area())  // true for two unit circles

let q = makeSquare(side: 2)
print(q.area())              // 4.0

只能有一个隐藏类型

规则:具有不透明返回类型的函数必须在所有路径上返回同一个具体类型。不同分支 → 编译错误。

// ❌ This would NOT compile, because different branches return different concrete types:
// func makeShape(flag: Bool) -> some Shape {
//     if flag {
//         return Circle(r: 1)
//     } else {
//         return Square(s: 1) // error: underlying type must be the same
//     }
// }
// Rule: an opaque-returning function must always produce the same concrete type.

带泛型的不透明类型

不透明返回值可以与泛型组合。调用方看到的是一个 Shape,而您可以将 Scaled<Circle> 的实现保持为私有。

// A generic decorator that also conforms to Shape
struct Scaled<S: Shape>: Shape {
    let base: S
    let k: Double
    func area() -> Double { base.area() * k * k }
}

// Factory still hides the concrete generic type
func makeScaledUnitCircle(k: Double) -> some Shape {
    Scaled(base: Circle(r: 1.0), k: k)
}

let s1 = makeScaledUnitCircle(k: 2)
print(s1.area())  // 4 * π

何时选择不透明类型

在以下情况下使用不透明类型:

  • 您想要隐藏实现,但保留静态类型检查。
  • 接口应返回协议视图(例如 Shape),而不公开具体类型。
  • 您构建的流水线/DSL会串联各个构建器,同时保持泛型特性。

(您将在下一课中将其与存在类型进行比较。)

不透明结果定义

快速检查:some P 保证了什么?

回顾

回顾:不透明结果类型(some P)会隐藏具体类型,同时保留静态分派。底层类型对于每个函数都是固定的;使用它们可以构建简洁、快速且封装良好的接口。

常见问题解答

「some P(不透明结果类型):隐藏具体类型」课时是免费的吗?

是的 — 「some P(不透明结果类型):隐藏具体类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 3 节课。

「some P(不透明结果类型):隐藏具体类型」这节课中我会学到什么?

返回 some P ,在承诺符合 P 的同时隐藏具体返回类型;调用方可获得静态类型性能,而无需暴露实现细节。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「some P(不透明结果类型):隐藏具体类型」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. some P(不透明结果类型):隐藏具体类型
  2. any P(存在类型):权衡与动态分派
  3. 在 some、any 与泛型之间进行选择
← 返回 Swift Academy