通用矢量与基数类型安全

时间:2015-12-17 19:10:50

标签: swift generics

我第一次玩Swift,特别是它的仿制药。作为一项个人练习,我正在实现一个结构来模拟任意n的n维向量。

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

我正在尝试找到一种类型安全的方法,类似于C++'s templates, which let you specify any arbitrary variable as a type

这是我正在寻找的语法:

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

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

有没有办法实现这种编译时类型检查?

1 个答案:

答案 0 :(得分:2)

Swift目前没有本机依赖类型的数组。不过,您可以自己创建一个,this great blogpost查看@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

您可以将代码和帖子作为Playground here获取。