我第一次玩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
你可以在这里获得代码和帖子作为游乐场。