在Swift Language Guide我们阅读以下内容:
Swift’s Array type is bridged to Foundation’s NSArray class.
当第一个是值类型而后者是一个引用时,如何将 Swift 的 Array
桥接到 Foundation 的 NSArray
类输入?桥接是否意味着拥有一种语言的接口(interface)以使用不同语言的代码?
最佳答案
这里的值/引用区别有点转移注意力。
桥接(也许令人惊讶)简单明了。有一个内部协议(protocol),_ObjectiveCBridgeable
,它描述了一种可以在 ObjC 和 Swift 类型之间转换的类型。例如,编译器将 mySwiftArray as NSArray
替换为对 _bridgeToObjectiveC()
的调用。
可以看到Array
's conformance to the protocol在基金会。这是简单的 Swift 代码:每个方法只是构造一个适当桥接类型的实例。
所以这与原生 Swift Array
是值类型这一事实没有任何关系。
至于那一 block ;虽然在外部是一个“值”,但 Swift.Array
实际上有一个指向其自身存储的内部指针。如果您仔细考虑一下,这是让它发挥作用的唯一明智方法。您不希望每次将数组分配给新变量时都移动数组中的 101 个东西。只是一个很好的指针的快速副本。 (当然你需要 to do the copy if you want to change something ,但它会延迟尽可能长的时间。)
您可以在 C 结构中看到基本相同的行为,其中的字段是对某些已分配内存的引用:
typedef struct _Array {
void * payload;
} Array;
Array c;
c.payload = malloc( /* Whatever */ );
Array d = c;
分配给 d
将 指针 复制到存储,但只有一 block 分配的内存未移动或复制。 (并且要向后扩展它,您可以按照 Swift.Array
的相同方式将其“桥接”到 NSArray
:通过提供一个适当的函数来进行转换。)
关于objective-c - Swift 的 Array 类型桥接到 Foundation 的 NSArray 类,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45116205/