Swift的Array类型是桥接到Foundation的NSArray类,怎么样?

时间:2017-07-15 08:34:40

标签: objective-c swift

Swift Language Guide中,我们阅读了以下内容:

  

Swift的Array类型桥接到Foundation的NSArray类。

当第一个是值类型而后者是时,如何将Swift的Array桥接到基金会的NSArray类>参考类型?没有桥接意味着在语言中使用不同语言的代码?

2 个答案:

答案 0 :(得分:4)

这里的价值/参考区别有点像红鲱鱼。

桥接(可能令人惊讶)直截了当。有一个内部协议_ObjectiveCBridgeable,它描述了一个可以在ObjC和Swift类型之间转换的类型。例如,编译器会将mySwiftArray as NSArray替换为_bridgeToObjectiveC()

您可以在基金会中看到Array's conformance to the protocol。它是简单的Swift代码:每个方法只构造一个适当的桥接类型的实例。

因此,本机Swift Array是值类型的事实并没有任何关系。

至于那件;虽然外部是一个“值”,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会将指针的副本复制到存储中,但只有一块已分配的内存,但尚未移动或被复制。 (为了向后扩展,你可以以NSArray的方式将其“桥接”到Swift.Array:通过提供适当的函数来进行转换。)

答案 1 :(得分:0)

我们可以说明如何在不观看视频的情况下支持视频,但也可以这样做!

  

没有桥接是指在语言中使用不同语言的代码?

一般来说,桥梁只是一种连接方式......

  

当第一个是值类型而后者是引用类型时,如何将Swift的数组桥接到Foundation的NSArray类?

......作为流程的一部分,这并不妨碍转换。

要对NSArray进行子类化,只需要覆盖两个方法countobjectAtIndex:。要将Swift数组桥接到Objective-C,可以定义NSArray的子类,其中包含Swift数组的(副本),即存储在实例变量中。

这个子类将根据包装的Swift数组上的相应方法实现两个必需的Objective-C方法,进行必要的额外处理;例如在索引期间将Swift值包装为不透明的Objective-C对象或将其转换为相应的Objective-C对象。这样的过程将是" lazy",当访问它们时,Swift数组中的各个元素仅被转换为Objective-C对象。转换后的值可以缓存以避免重新转换。

实际实施将得到优化,并可能利用私人信息。但是,如上所示,没有什么可以阻止在Swift中将值类型呈现为Objective-C中的引用类型,反之亦然。

HTH