Phantomlike

这个包包含三种泛型类型:UnsignedValue<Storage, Unit>SignedValue<Storage, Unit>FloatingValue<Storage, Unit>。 这些类型可以用来实现类型安全的数值,这样你就不会意外地将两个不同类型(Units)的值相加。 Storage 参数用于指定每个值的底层算术类型(分别为有符号、无符号、浮点)。 Unit 参数是一个 虚类型,用于在编译时对单位进行类型检查。

安装

使用 Swift Package Manager。

import PackageDescription

let package = Package(
    name: "Phantomlike",
    dependencies: [
      .Package(url: "https://github.com/adamnemecek/Phantomlike.git", majorVersion: 1)
    ]
)

用法

import Phantomlike

struct FrequencyUnit { }
struct TimeUnit { }

typealias Hertz = UnsignedValue<UInt16, FrequencyUnit>
typealias Second = UnsignedValue<UInt16, TimeUnit>

let s: Second = 10
let hz: Hertz = 20

print(hz + hz) /// => Hertz(40)
print(s + hz) /// => compiler error

其他注意事项

请注意,编译器会允许你添加 Storage 类型的类型别名和字面量。例如:

print(hz + 10) /// => 30 as 10 is automatically converted

然而

let a = 10
print(hz + a) /// type error

这应该不是一个问题,但请注意这一点。