Swift 数组与 c 数组有何不同

How are Swift arrays different than c arrays

我正在努力将一些使用原始 c 数组的 ObjC 代码转换为 Swift 数组。但是,使用 playground,我发现了一些奇怪的行为。

例如,以下内容在 Swift

中完全有效
var largearray : [[Float]] = []
largearray.append([0,1,2])    //3 elements
largearray.append([3,4,5])    //3 elements
largearray.append([6,7,8,9])    //-4- elements
largearray.append([10,11,12])    //3 elements

//pull those back out
largearray[1][0]    //gives 3
largearray[1][2]    //gives 5
//largearray[1][3]    //error
largearray[2][0]    //gives 6
largearray[2][2]    //gives 8
largearray[2][3]    //gives 9
largearray[3][0]    //gives 10

我不明白为什么混合行长度是 Swift。有人可以解释这里发生了什么,因为文档没有详细说明。我很好奇它是否甚至在幕后存储了一个连续的 Float 数组。

那么我的另一个问题是关于访问行或列。在 Swift 中,我看到我可以使用 largearray[0] 访问整行给出 [0,1,2],就像 largearray[2] 给出 [6,7,8,9] 一样。这不是 c 数组的索引方式。 (如果我只是为二维 c 数组指定一个索引,它将作为逐列的顺序索引。那么,有什么方法可以访问 swift 中的整个列?在 c 中,Swift, largearray[][2] 是无效的。但我很好奇是否有一些技术没有在文档中提到,因为很明显 Swift 正在跟踪额外的信息。

我应该补充一点,我将使用 Accelerate 框架。因此,如果上述任何 "strange" 使用 Swift 数组的方法会导致大型数组出现性能问题,请告诉我。

How are Swift arrays different than c arrays

在 C 中,数组始终是元素的连续列表。在 Swift 中,数组是一种更抽象的数据结构。您可以使用 C 数组假设数据在内存中的组织方式,甚至可以在给定基地址、元素大小和索引的情况下计算元素的地址。在 Swift 中,没那么多。想想 Swift 的 Array 类型,就像你在 Objective-C 中想到 NSArray 一样。它是一个有序的元素序列,提供类似数组的操作,但您不必担心它如何存储实际数据。

I don't understand how it's possible to have a mixed row lengths is Swift.

嗯,一方面,您实际上是在查看一组数组。如果一个数组是一个对象,那么一个数组的数组可能被实现为一个对象指针列表,而不是一系列连续的相同大小的列表。例如,您可以对 NSArray 执行相同的操作,因为 NSArray 中的每个项目都可以是任何类型的对象。

So, is there some way to access an entire column in swift?

您需要遍历数组中的项目,它们本身就是数组,并检查您感兴趣的 "column" 位置的元素。我认为没有更快的方法做到这一点。