gpt4 book ai didi

objective-c - Swift 的 Array 类型桥接到 Foundation 的 NSArray 类,如何?

转载 作者:搜寻专家 更新时间:2023-10-31 08:30:16 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com