Cake-Pattern in Swift. inspired: https://gist.github.com/hatz48/73975371f96a93f5a05a1924bb98c1dd
struct User {
let username: String
}
extension User: CustomStringConvertible {
var description: String { return "username: \(username)" }
}
// DAO
protocol UserDAOType {
init()
func find() -> User
}
final class UserDAO: UserDAOType {
required init() {}
func find() -> User {
return User(username: "yashigani")
}
}
final class MockUserDAO: UserDAOType {
required init() {}
func find() -> User {
return User(username: "thai curry")
}
}
// Component
protocol UserDAOComponentType {
associatedtype DAO: UserDAOType
func userDao() -> DAO
}
extension UserDAOComponentType {
func userDao() -> DAO {
return DAO()
}
}
// Service
protocol UserService: UserDAOComponentType {
func fetchUser() -> User
}
extension UserService {
func fetchUser() -> User {
return userDao().find()
}
}
// Application
final class Application<T: UserDAOType>: UserService {
typealias DAO = T
}
let user1 = Application<UserDAO>().fetchUser()
let user2 = Application<MockUserDAO>().fetchUser()