Skip to content

Instantly share code, notes, and snippets.

@ukitaka
Last active January 19, 2017 09:45
Show Gist options
  • Select an option

  • Save ukitaka/91788ad0fed11e3e55d09e3551c6c027 to your computer and use it in GitHub Desktop.

Select an option

Save ukitaka/91788ad0fed11e3e55d09e3551c6c027 to your computer and use it in GitHub Desktop.
PhantomTypeをSwiftでもなんとかして使いたい
protocol LoginState { }
final class Login: LoginState { }
final class Logout: LoginState { }
class LoginStateAction<State>: LoginStateActionType { }
protocol LoginStateActionType {
func loginState() -> LoginStateAction<Login>?
func logoutState() -> LoginStateAction<Logout>?
}
extension LoginStateActionType {
func loginState() -> LoginStateAction<Login>? {
return self as? LoginStateAction<Login>
}
func logoutState() -> LoginStateAction<Logout>? {
return self as? LoginStateAction<Logout>
}
}
extension LoginStateAction where State: Login {
func logout() -> LoginStateAction<Logout> {
return LoginStateAction<Logout>()
}
}
extension LoginStateAction where State: Logout {
func login() -> LoginStateAction<Login> {
return LoginStateAction<Login>()
}
}
let action: LoginStateActionType = LoginStateAction<Login>() // !!! ここを実現するためにassociatedTypeを使わない
action.loginState()?.logout()
action.logoutState()?.login()
@ukitaka
Copy link
Author

ukitaka commented Jan 19, 2017

状態がふえるときつそう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment