这个包包含三种泛型类型: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
这应该不是一个问题,但请注意这一点。