Swift不透明类型的Objective-C等效是否为id<protocol>?装箱类型等效是什么?
Swift与Objective-C类型等效问题解答
不透明类型的Objective-C等效
Swift的不透明类型(比如some Protocol)没办法直接暴露给Objective-C——Objective-C的类型系统不支持“隐藏具体类型但保留类型一致性”的语义。如果要找最接近的替代写法,id<Protocol>确实是Objective-C里最匹配的:
- 两者对外都表示“遵循指定协议的任意类型实例”;
- 但要注意核心区别:Swift不透明类型是编译期类型安全的,编译器清楚具体类型只是对外隐藏;而
id<Protocol>是动态类型,只有运行时才确定具体类型,还没法保证多次返回的实例是同一具体类型。
装箱类型的Objective-C等效
Swift里的装箱类型一般指把值类型包装成引用类型的容器(比如自定义的Box<T>类,或者标准库中隐式桥接的Foundation类型),对应的Objective-C等效分两种情况:
- 对于Swift标准库值类型的自动装箱(比如
Int转NSNumber、String转NSString、Array转NSArray这类),Objective-C里直接用对应的Foundation类型就行,这是语言层面的自动桥接; - 要是自定义的通用装箱容器(比如用来包装任意值类型的
Box<T>),在Objective-C里得定义一个继承自NSObject的类,用id类型的属性来存被包装的值(Objective-C会自动把Swift值类型桥接成对应的Foundation引用类型存储)。
内容的提问来源于stack exchange,提问作者user22797201
相关产品推荐
相关产品推荐

