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

标签 objective-c swift

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/

相关文章:

objective-c - 四舍五入 NSDecimalNumber

ios - 在 Swift 中使用 'Any' 有什么意义?什么时候使用 'Any' 什么时候使用 'AnyObject' ?

swift - 从 Firebase 下载图片

ios - 不会处理从这里抛出的错误,因为 context.save 中的封闭捕获并不详尽

ios - 在文本标签中显示数组

ios - 中心对齐蒙版 UIImageView/模仿 Twitter 和 Facebook 应用程序的 ImageView

iphone - 正确释放一个 viewController,将其自身设置为其他类的委托(delegate)?

swift - 获取周围坐标的最短代码是什么?

ios - RxSwift 观察数组变化

objective-c - 使用 Xcode 9 编译框架