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" 位置的元素。我认为没有更快的方法做到这一点。
我正在努力将一些使用原始 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" 位置的元素。我认为没有更快的方法做到这一点。