Ios xcode-swift三维阵列

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

我正在尝试构建一个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
        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