按索引访问struct成员

时间:2017-03-26 23:59:13

标签: swift struct swift3

如果我有像

这样的结构
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

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

2 个答案:

答案 0 :(得分:1)

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

结构的n成员的类型在编译时直到n才知道?

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

Swift设计师本可以选择为结构包含一个特殊情况,所有结构的元素都是相同类型,但这可能会让人感到困惑。

您应该考虑您的设计以及您需要此操作的原因以及对组件的命名访问权限。如果重要的是考虑具有适当操作的自定义类型,可能基于存储阵列。

答案 1 :(得分:1)

这是获取组件价值的一种方法。它应该是有效的。对下标/开关替代方案进行性能测试很有意思,看看速度差异。

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