使用 some 关键字的不透明类型
从函数返回不透明类型,在不公开具体类型的情况下保留类型身份。
使用 some 关键字的不透明类型 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
不透明类型解决的问题
使用 any 返回协议类型会丢失类型信息。some 可以在隐藏实现的同时保留这些信息。
protocol Shape { var area: Double { get } }
struct Circle: Shape { var area: Double { .pi * 4 } }返回 some 协议
将 some Shape 作为返回类型,表示“我会返回一种特定的 Shape 类型”,但不会透露具体是哪一种。
func makeShape() -> some Shape {
return Circle()
}
let s = makeShape()
print(s.area)类型身份得到保留
由于 some 类型具有固定的底层类型,编译器可以允许需要 Self 的操作。
func makeEquatableShape() -> some Shape & Equatable {
return Circle()
}
let a = makeEquatableShape()
let b = makeEquatableShape()
print(a == b) // works because types matchsome 与 any
some 是不透明类型(单一固定类型),any 是存在类型(运行时可以是任何遵循协议的类型)。
func withSome() -> some Shape { Circle() } // opaque
func withAny() -> any Shape { Circle() } // existentialSwiftUI Body 中的 some
SwiftUI 使用 some View,使每个视图的 body 都能返回单一且一致的类型,同时不暴露布局内部细节。
struct ContentView: View {
var body: some View {
Text("Hello, World!")
}
}使用 some 的不透明参数
Swift 5.7+ 允许在参数位置使用 some Protocol,这是泛型约束的一种语法糖。
func printArea(_ shape: some Shape) {
print(shape.area)
}
printArea(Circle())反向泛型
不透明参数 some P 等价于 。编译器会在调用位置推断 T。
func doubled(_ value: some Numeric) -> some Numeric {
value * 2
}some 上的约束
您可以像使用泛型一样,将多个协议组合到不透明类型中。
func process(_ item: some Codable & Hashable) {
let hash = item.hashValue
print(hash)
}返回不同类型
与存在类型不同,使用不透明类型时,不能从不同分支返回不同的遵循类型。
// This would NOT compile:
// func shape(_ big: Bool) -> some Shape {
// big ? Circle() : Square() // ERROR: different types
// }协议中的不透明类型
对于带关联类型的协议,使用 some 作为返回类型会让它们更易于使用。
protocol Buildable { associatedtype Output; func build() -> Output }
func build(_ b: some Buildable) -> some Any {
b.build()
}何时选择 some
当您返回一种一致的类型并希望保留类型身份时,优先使用 some。当您需要异构集合时,使用 any。
var shapes: [any Shape] = [Circle(), Circle()]
let single: some Shape = Circle()快速检查
some 关键字对返回类型做出了什么保证?
课程回顾
some 会创建不透明返回类型,在隐藏具体类型的同时保留类型身份。SwiftUI 的 some View 是典型示例。单一类型返回值使用 some,异构集合使用 any。
常见问题解答
「使用 some 关键字的不透明类型」课时是免费的吗?
是的 — 「使用 some 关键字的不透明类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「使用 some 关键字的不透明类型」这节课中我会学到什么?
从函数返回不透明类型,在不公开具体类型的情况下保留类型身份。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 some 关键字的不透明类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 泛型约束与 where 子句
- 使用 some 关键字的不透明类型
- 使用 any 的存在类型与类型擦除
- 主要关联类型与类型化抛出