Ios xcode-swift三维阵列
我正在尝试构建一个3D阵列。下面是我从2D数组中修改的代码。3D数组不会根据我定义的值打印出我的数组。在我的下标中,我的getter和setter有问题。有人能给我建议吗Ios xcode-swift三维阵列,ios,arrays,swift,Ios,Arrays,Swift,我正在尝试构建一个3D阵列。下面是我从2D数组中修改的代码。3D数组不会根据我定义的值打印出我的数组。在我的下标中,我的getter和setter有问题。有人能给我建议吗 import UIKit class Array3D { var zs:Int, ys:Int, xs:Int var matrix: [Int] init(zs: Int, ys:Int, xs:Int) { self.zs = zs self.ys = ys
import UIKit
class Array3D {
var zs:Int, ys:Int, xs:Int
var matrix: [Int]
init(zs: Int, ys:Int, xs:Int) {
self.zs = zs
self.ys = ys
self.xs = xs
matrix = Array(count:zs*ys*xs, repeatedValue:0)
}
subscript(z:Int, ys:Int, xs:Int) -> Int {
get {
return matrix[ zs * ys * xs + ys ]
}
set {
matrix[ zs* ys * xs + ys ] = newValue
}
}
func zsCount() -> Int {
return self.zs
}
func colCount() -> Int {
return self.ys
}
func rowCount() -> Int {
return self.xs
}
}
var dungeon = Array3D(zs: 5, ys: 5, xs: 5)
dungeon[1,0,0] = 1
dungeon[0,4,0] = 2
dungeon[0,0,4] = 3
dungeon[0,4,4] = 4
print("You created a dungeon with \(dungeon.zsCount()) z value \(dungeon.colCount()) columns and \(dungeon.rowCount()) rows. Here is the dungeon visually:\n\n")
for z in 0..<5 {
for y in 0..<5 {
for x in 0..<5 {
print(String(dungeon[z,x,y]))
}
print("\n")
}
print("\n")
}
导入UIKit
类数组3D{
变量zs:Int,ys:Int,xs:Int
变量矩阵:[Int]
init(zs:Int,ys:Int,xs:Int){
self.zs=zs
self.ys=ys
self.xs=xs
矩阵=数组(计数:zs*ys*xs,重复值:0)
}
下标(z:Int,ys:Int,xs:Int)->Int{
得到{
返回矩阵[zs*ys*xs+ys]
}
设置{
矩阵[zs*ys*xs+ys]=新值
}
}
func zscont()->Int{
return self.zs
}
func colCount()->Int{
返回self.ys
}
func rowCount()->Int{
return self.xs
}
}
var dungeon=Array3D(zs:5,ys:5,xs:5)
地牢[1,0,0]=1
地牢[0,4,0]=2
地牢[0,0,4]=3
地牢[0,4,4]=4
打印(“您创建了一个包含\(dungeon.zscoount())z值\(dungeon.colCount())列和\(dungeon.rowCount())行的副本。下面是该副本:\n\n”)
对于0..中的z,下标中的索引计算方式存在错误。要将(z,y,x)
转换为线性坐标,可以使用:
z * ys * xs + y * xs + x
因此,下标应固定如下:
subscript(z:Int, y:Int, x:Int) -> Int {
get {
return matrix[ z * ys * xs + y * xs + x ]
}
set {
matrix[ z * ys * xs + y * xs + x ] = newValue
}
}
请注意,循环内的print语句中的索引是反向的:
print(String(dungeon[z,x,y]))
它应该是[z,y,x]
通过这些更改,这是我在操场上获得的输出:
00003
00000
00000
00000
20004
10000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
00000
附录
zs
、ys
和xs
表示三维矩阵的大小:有xs
列、ys
行和zs
平面。每个列的大小为xs
,每个平面的大小为xs*ys
对于y=0和z=0,对应于x=3的数组中的元素是第四个元素,具有索引3(数组是基于零的,以及三维坐标)。如果y=1,则元素为3+行大小,即3+5=8。让它更通用
x + xs * y = 3 + 1 * 5 = 8
每个平面的大小改为xs*ys,对应于25。所以z坐标必须乘以这个尺寸。这导致了我使用的公式:
z * ys * xs + y * xs + x
如果z=0,坐标为(0,1,3):
如果z=1,则坐标为(1,1,3),公式结果为:
1 * 5 * 5 + 1 * 5 + 3 = 33
等等
如果这听起来很复杂,请查看代码生成的输出,它由5个块(共5行)组成,每个块包含5个数字。如果将其转换为一行(通过删除换行符),则可以通过从零到所需元素(从左到右)计数来获得数组索引。可以通过向索引添加5跳到下一行,通过添加25跳到下一个平面
希望能澄清一点。@Antonion谢谢!它起作用了!z和zs,y和ys,x和xs之间的区别是什么?你能解释一下为什么线性坐标是z*ys*xs+y*xs+x吗?我真的很感谢你的帮助!谢谢你的详细解释。我还需要一些时间来理解它,我真的很感激。我有个问题要征求你的意见。你知道Basic C语言和swift之间的多维数组结构有什么不同吗?因为,我有一个带有3D数组的基本C代码,可以进行某些计算(减法、加法、乘法和减法)来得到一些结果。现在,我正在使用SWIFT语言将其提交给Xcode。这可能吗?我现在还不确定,因为这似乎是一个运行时错误,而且我还没有找到问题所在…我还没有将C与swift一起使用,所以我无法回答这个问题。在swift参考手册中有一个关于与C代码交互的部分,你可能会在那里找到答案
1 * 5 * 5 + 1 * 5 + 3 = 33