通过索引访问结构体成员

3
如果我有一个结构体,例如:
struct Point4D
{
    let x:Double, 
        y:Double, 
        z:Double, 
        w:Double
}

有没有一种高效的方式通过整数索引访问struct 的成员?也就是说

let index:Int = 2
let point:Point4D = Point4D(x: 1, y: 5, z: 3, w: 8)
let component:Double = point [index] // 3

我认为可以通过在Point4D上定义subscript()方法并使用switch语句来实现,但这似乎不是很高效。在C中,我相信您可以增加指向第一个结构成员的指针,因为它们都是Double类型,但Swift不允许这样做...


2
最好定义一个四元素数组,并提供四个计算属性以访问其元素。 - Sergey Kalinichenko
2个回答

1
这里有一种获取组件值的方法。它应该是高效的。有趣的是,可以进行性能测试以比较使用下标/switch 的替代方案的速度差异。
func componentValue(_ pointer: UnsafePointer<Point4D>, at index: Int) -> Double {
    return pointer.withMemoryRebound(to: Double.self, capacity: 4) { ptr -> Double in
        return (ptr+index).pointee
    }
}

struct Point4D
{
    let x:Double,
    y:Double,
    z:Double,
    w:Double
}

let index:Int = 2
var point:Point4D = Point4D(x: 1, y: 5, z: 3, w: 8)
let component:Double = componentValue(&point, at: index)    // 3

如果成员有不同的类型呢? - Julio Bailon

1

在Swift的上下文中考虑你所要求的,它是一种强(主要)静态类型语言。

如果不知道n是多少,那么结构体的第n个成员的类型会是什么?

(请注意,在引用元组元素时,例如(1, true, 3.4).1 -> true,选择器是一个字面值而不是变量,因此类型始终是已知的。)

Swift设计者本可以为所有元素都是相同类型的结构体包含一个特殊情况,但这可能会相当令人困惑。

你应该考虑你的设计以及为什么需要这个操作和命名对组件进行访问。如果很重要,请考虑使用适当操作的自定义类型,可能基于一个数组进行存储。


该部分代码需要进行索引访问,因为我正在执行点积运算,但由于目标向量平行于坐标系的轴,当您可以仅获取所需分量时,执行完整的点积运算是徒劳的。在其他地方使用了命名访问,因此使用 Array 作为数据结构会很尴尬。 - taylor swift
你不一定需要索引访问来执行点积,在只有4个元素向量的情况下,它并不明显是一个优势。但是,如果您希望支持它,请考虑使用自定义类型,该类型在内部使用数组并提供适当的操作,如建议的单独属性和索引操作。希望对您有所帮助。 - CRD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接