【问题标题】:access struct member by index按索引访问结构成员
【发布时间】:2017-03-26 23:59:12
【问题描述】:

如果我有一个像

这样的结构
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 不允许这样做……

【问题讨论】:

  • 您最好定义一个四元素数组,并提供四个计算属性来访问其元素。

标签: swift struct swift3


【解决方案1】:

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

结构的nth 成员的类型是什么,而n 直到编译时才知道?

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

Swift 设计者本可以选择为所有元素都是相同类型的结构添加一个特殊情况,但这可能会造成相当混乱。

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

【讨论】:

  • 在这部分代码中需要索引访问,因为我正在执行点积,但是由于目标向量平行于坐标系的轴,所以如果你可以只做全点积是浪费的抓住你想要的组件。命名访问在其他任何地方都使用,因此使用 Array 作为数据结构会很尴尬。
  • 您不需要需要索引访问来执行点积,并且只有 4 元素向量并不清楚它是否是一个胜利。但是,如果您希望支持它,请考虑在内部使用数组并按照建议提供适当操作的自定义类型 - 例如每个元素的单独属性和索引操作。 HTH
【解决方案2】:

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

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

【讨论】:

  • 如果成员有不同的类型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2013-05-31
相关资源
最近更新 更多