具有基数类型安全性的泛型向量



我第一次玩Swift,尤其是它的泛型。作为一个个人练习,我正在实现一个结构来为任何n维向量建模。

许多向量运算只对某些基数有效。例如,将二维矢量添加到三维矢量没有多大意义。叉积只能在一对3维或7维向量上计算。

我正试图找到一种类型安全的方法来实现这一点,类似于C++的模板,它允许您将任何任意变量指定为类型。

这就是我正在寻找的语法类型:

var vector2D = Vector<2>(1,2)
var vector3D = Vector<3>(3,4,5)
var fail = vector2D + vector3D //disallowed because of mismatched cardinality.

目前,基数是一个结构成员,其值是从init()的数字参数中推断出来的。这允许我在运行时检查基数,但不允许在编译时进行检查。

有没有一种方法可以实现这种编译时类型检查?

Swift目前没有本机依赖类型数组。然而,你可以自己创建一个,看看@oisdk的这篇很棒的博客文章,它对这个主题进行了深入的研究。有了上面提到的代码,你可以有这样的东西:

let twoLong = emptyArray() +| 1 +| 2
let twoChar = emptyArray() +| "a" +| "b"
onlySameLength(twoLong, rhs: twoChar)
let threeInts = emptyArray() +| 1 +| 2 +| 3
onlySameLength(twoLong, rhs: threeInts) // error

你可以在这里获得代码和帖子作为游乐场。

最新更新