Saik0s
4/1/2016 - 9:52 AM

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()