在Swift 语言指南中,我们阅读了以下内容:
Swift 的 Array 类型桥接到 Foundation 的 NSArray 类。
当第一个是值类型而后者是引用类型时,如何将 SwiftArray桥接到 Foundation 的NSArray类?桥接是否意味着拥有一种语言的界面来使用另一种语言的代码?
这里的价值/参考区别有点红鲱鱼。
桥接是(也许令人惊讶的)直截了当的。有一个内部协议 ,_ObjectiveCBridgeable它描述了一种可以在 ObjC 和 Swift 类型之间转换的类型。编译器替换,例如,您mySwiftArray as NSArray的调用_bridgeToObjectiveC()。
您可以在 Foundation 中查看Array对协议的一致性。这是简单的 Swift 代码:每个方法只构造一个适当桥接类型的实例。
因此,与原生 SwiftArray是值类型这一事实没有任何关系。
至于那一块;虽然在外部是一个“值”,但Swift.Array实际上有一个指向它自己存储的内部指针。如果您想一想,这是让它发挥作用的唯一明智方法。您不希望每次将数组中的 101 项分配给新变量时都将其移动。只是指针的一个很好的快速副本。(当然,如果您想更改某些内容,则需要进行复制,但它会尽可能延迟。)
您可以在 C 结构中看到基本相同的行为,其中的字段是对某些已分配内存的引用:
typedef struct _Array {
void * payload;
} Array;
Array c;
c.payload = malloc( /* Whatever */ );
Array d = c;
Run Code Online (Sandbox Code Playgroud)
分配 tod会复制指向存储的指针,但只有一块已分配的内存,尚未移动或复制。(为了向后扩展,你可以NSArray用同样的方式“桥接”Swift.Array它:通过提供一个适当的函数来进行转换。)
| 归档时间: |
|
| 查看次数: |
928 次 |
| 最近记录: |