幻象类型(Phantom Type)与状态机:在编译期杜绝非法操作
利用泛型约束和未被使用的类型参数,将状态编码进类型系统,使得非法状态转换在编译期就被捕获。实现铁路售票、网络连接等状态机。 · 难度:入门 · +10XP
幻象类型(Phantom Type)与状态机:在编译期杜绝非法操作
幻象类型是泛型参数不直接用于存储,而是用于标记状态的类型。通过定义多个标记类型(如LoggedIn、Guest),你可以让某些方法只在特定状态下可用。本教程将展示如何创建优雅的零运行时开销状态机,强制所有状态转换合法。还会涉及associatedtype和where子句的高级用法。
enum Guest {}
enum LoggedIn {}
struct User<State> {
let id: String
init(id: String) { self.id = id } // 泛型默认为Guest
}
extension User where State == LoggedIn {
func logout() -> User<Guest> { User<Guest>(id: self.id) }
func canPurchase() -> Bool { true }
}
extension User where State == Guest {
func login() -> User<LoggedIn> { User<LoggedIn>(id: self.id) }
}
let guest = User(id: "1") // Guest状态
// guest.canPurchase() // 编译报错!
let logged = guest.login()
print(logged.canPurchase())