Closed ValseLee closed 8 months ago
이상하고 아름다운 GSApiTransferable 프로토콜을 구현합니다.
GSApiTransferable
해당 프로토콜을 채택하는 객체 혹은 구조체를 인스턴스화하여 필요한 타입을 CRUD 할 수 있습니다.
용례
Codable
/*--------------------*/ /*---protocol Layer---*/ /*--------------------*/ private protocol GSApiTransferable<T> { associatedtype T: Codable var create: () async throws -> T? { get set } var read: () async throws -> T? { get set } var delete: () async throws -> T? { get set } var update: () async throws -> T? { get set } } public struct GSFirebaseClient<T: Codable>: GSApiTransferable { public var create: () async throws -> T? public var read: () async throws -> T? public var delete: () async throws -> T? public var update: () async throws -> T? public init( create: @escaping () -> T? = { return nil }, read: @escaping () -> T? = { return nil }, delete: @escaping () -> T? = { return nil }, update: @escaping () -> T? = { return nil } ) { self.create = create self.read = read self.delete = delete self.update = update } } // MARK: Additional Helpers extension GSFirebaseClient { // 요런 식으로 Client를 확장하여 필요한 로직을 추가 제공 public func fetchAll() -> [T] { return [] } } /*-----------------*/ /*---Model Layer---*/ /*-----------------*/ struct ModelSample: Codable { } struct GitHubModel: Codable { } struct FirebaseModel: Codable { } /*----------------*/ /*---View Layer---*/ /*----------------*/ private struct MyView: View { let firebaseClient: some GSApiTransferable = GSFirebaseClient( create: { return ModelSample() }, read: { return ModelSample() } ) let githubClient: some GSApiTransferable = GSGitHubClient<GitHubModel>() var body: some View { VStack { } } }
좋은 추상화 시도인 것 같습니다! 예전에 보여주셨던 live와 test 객체를 생성 시점에 결정하는 것과도 유사하네요. 고생하셨습니다!!!
개요
17
이상하고 아름다운
GSApiTransferable
프로토콜을 구현합니다.해당 프로토콜을 채택하는 객체 혹은 구조체를 인스턴스화하여 필요한 타입을 CRUD 할 수 있습니다.
GSApiTransferable
프로토콜의 인스턴스를 생성하며 클로저를 주입하는 방식으로 구현합니다.GSApiTransferable
프로토콜을 채택하는 타입을 확장하여 구현합니다.용례
GSApiTransferable
프로토콜을 채택하는 구조체는Codable
을 채택하는 타입을 제너릭으로 받습니다.✏️ 작업 사항