본문 바로가기

개발/Swift

[Swift] 프로토콜 지향 제네릭

반응형

프로토콜 지향 설계에서는 언제나 프로토콜로 시작한다

protocol List {
    associatedtype T
    
    subscript<E: Sequence>(indices: E) -> [T] where E.Iterator.Element == Int { get }
    
    func length() -> Int
    func get(at index: Int) -> T?
    
    mutating func add(_ item: T)
    mutating func delete(at index: Int)
}

 

아래는 활용편이다

 


선언부, 구현부로 분리하여 네트워킹 코드를 작성할 것이다
이 글은 RxSwift를 사용한다

Usecase (선언부)

import RxSwift

protocol PasswordUsecase: PasswordCheckUsecase, PasswordChangeUsecase { }

protocol PasswordCheckUsecase {
    /// 비밀번호 확인
    func reqCheckPassword(path: CheckPassword_API.Path, req: CheckPassword_API.Request) -> Observable<CheckPassword_API.Response>
}

protocol PasswordChangeUsecase {
    /// 비밀번호 변경
    func reqChangePassword(path: CheckPassword_API.Path, req: CheckPassword_API.Request) -> Observable<CheckPassword_API.Response>
}

최상위 PasswordUsecase 를 두고, 이에 타 프로토콜을 선언해두어 최상위로 확장한다 
분리하여 작성해둔 이유는 추가, 삭제, 수정 등 변경사항이 있을 때 해당 Protocol만 붙이고 떼어내면 되어 간략해지기 때문 🙂

 

Service (구현부)

import RxSwift

class PasswordService: PasswordUsecase {
	
    func reqCheckPassword(path: CheckPassword_API.Path, req: CheckPassword_API.Request) -> Observable<CheckPassword_API.Response> {
    	...
    }
    
    func reqChangePassword(path: CheckPassword_API.Path, req: CheckPassword_API.Request) -> Observable<CheckPassword_API.Response> {
     	...
    }
    
}

구현부 내에서 위의 프로토콜을 핸들링한다
선언부와 구현부를 나누어 작성한 이유는, 이후 테스트를 진행할 때 해당 프로토콜을 채택하여 사용하면 편리하기 때문이다 👍

반응형

'개발 > Swift' 카테고리의 다른 글

[Swift] UI - Dynamic TableView  (0) 2022.10.29
[Swift] Set 연산  (0) 2021.06.17
[Swift] TextField 앞 뒤 공백 없애기  (0) 2021.04.22
[Swift] 테이블 뷰 -> 테이블 뷰 drag and drop  (0) 2021.04.20
[Swift] 문자열 다루기  (0) 2021.03.31