PhantomTypes
A phantom type is a custom type that has one or more unused type parameters.
Phantom types allow you to enforce type-safety without sacrificing readability. It also reduces the amount of tests we need to write because silly mistakes are forbidden by the compiler.
If you're keen to know more, I recommend you read my medium article.
Example
Consider we have a User object like this...
struct User {
  var email: Email = ""
  var name: Name = ""
  var age: Age = 18
  var isAdmin: IsAdmin = false
}
If a developer tries to set a name value to the email property we will get a type-mismatch error from the compiler.
How can we enforce type-safety?
enum Types {
  enum Email {}
  enum Name {}
  enum Age {}
  enum IsAdmin {}
}
typealias Email = Phantom<Types.Email, String>
typealias Name = Phantom<Types.Name, String>
typealias Age = Phantom<Types.Age, Int>
typealias Location = Phantom<Types.IsAdmin, Bool>
Adding even more context
We might even consider making them even more explicit, so a User's email can't be assigned to another Email field in the code, such as the Login email...
protocol EmailHaving {}
extension EmailHaving {
  typealias Email = Phantom<Phantom<Self, Types.Email>, String>
}
extension User: EmailHaving {}
extension Login: EmailHaving {}
User().email = Login().email // type-mismatch error!