我们通常看到的下标操作都是一维的,不过如果有需要,我们可以定义多维的下标操作,如下代码所示:

// 定义一个三维结构体
struct Vector3D<T: Equatable> {
    var x: T
    var y: T
    var z: T
}

// 向量数组
struct VectorArray<T: Equatable> {
    
    var vectors: [Vector3D<T>] = []
    
    init() {
        
    }
    
    mutating func append(vector: Vector3D<T>) {
        vectors.append(vector)
    }
    
    // 此处是根据输入的x, y, z值来确定是否有对应的值,而不是索引
    // 如果有,则返回该向量值;如果没有,返回nil
    subscript(x: T, _ y: T, _ z: T) -> Vector3D<T>? {
        for vector in vectors {
            if vector.x == x && vector.y == y && vector.z == z {
                return vector
            }
        }
        
        return nil
    }
}

var vectors = VectorArray<Int>()

vectors.append(vector: Vector3D(x: 0, y: 1, z: 2))
vectors.append(vector: Vector3D(x: 3, y: 4, z: 6))
vectors.append(vector: Vector3D(x: 8, y: 4, z: 8))

print(vectors[0, 0, 0])            // nil
print(vectors[3, 4, 6])            // Optional(__lldb_expr_167.Vector3D<Swift.Int>(x: 3, y: 4, z: 6))