swift 范型之类型擦除
泛型的本质是 在编译时进行类型特化(Monomorphization),即:
- 编译器并不会直接生成通用的 T 类型代码。
- 在编译时,Swift 会根据实际传递的类型生成对应的代码,类似于 C++ 的模板展开。
- 如果多次调用泛型函数,但参数类型不同,编译器会为每种类型生成一份具体实现。
在 Swift 中,泛型协议不能直接用于变量。如果你想存储 不同泛型类型,可以使用 类型擦除模式(Type Erasure)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | protocol Shape { func area () - > Double } // 泛型包装类,隐藏泛型类型,让 shapes 数组可以存储不同的 <code>Shape</code> 类型。 class AnyShape < T : Shape > : Shape { private let _area : () - > Double init < U : Shape > ( _ shape : U ) where U == T { _area = shape . area } func area () - > Double { return _area () } } struct Circle : Shape { var radius : Double func area () - > Double { return . pi * radius * radius } } struct Square : Shape { var side : Double func area () - > Double { return side * side } } // ✅ 允许存储不同 Shape 类型 let shapes : [ AnyShape < Shape > ] = [ AnyShape ( Circle ( radius : 5 )), AnyShape ( Square ( side : 4 ))] for shape in shapes { print ( shape . area ()) } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架