반응형
서론
프로토콜 타입을 사용할 때 불편한 점이 하나 있습니다.
메서드 파라미터에 기본 값을 사용할 수 없다는 점입니다.
예를 들어, UseCase의 execute 파라미터로 page를 전달해야 한다고 합시다.
protocol UseCaseProtocol {
func execute(page: Int)
}
struct UseCase: UseCaseProtocol {
func execute(page: Int) {
// Logic
}
}
let useCase: UseCaseProtocol = UseCase()
useCase.execute(page: 1)
그러면 위 코드처럼 항상 page를 전달해줘야 해요.
page에 기본 값을 설정하고 싶어도 프로토콜 메서드에는 Default argument를 설정할 수 없다는 컴파일 에러가 발생합니다.
이 문제를 해결하는 가장 쉬운 방법은 프로토콜 타입이 아니라 구체 타입을 사용하는 거예요.
struct UseCase: UseCaseProtocol {
func execute(page: Int = 1) {
// Logic
}
}
let useCase: UseCase = UseCase()
useCase.execute()
프로토콜 메서드를 구현한 곳에 기본 값을 설정하고,
구체 타입을 사용하면 기본 값을 설정할 수 있습니다.
하지만 이걸 기대하고 검색을 하진 않으셨을 거예요?
프로토콜 타입을 유지하면서 기본 값도 사용하는 방법을 알아봅시다.
프로토콜 메서드의 매개변수 기본 값 설정
extension을 사용하면 프로토콜 메서드의 매개변수에 기본 값을 설정할 수 있습니다.
protocol UseCaseProtocol {
func execute(page: Int)
}
extension UseCaseProtocol {
func execute(page: Int = 1) {
execute(page: value)
}
}
기본 메서드를 구현해서 파라미터에 기본 값을 설정하고,
내부에서 동일한 메서드를 호출하는 겁니다.
let useCase: UseCaseProtocol = UseCase()
useCase.execute() // Good
그러면 호출부에서 프로토콜 타입을 사용하더라도 기본 값을 사용할 수 있습니다.
감사합니다.
참고
http://minsone.github.io/programming/swift-protocol-function-default-value
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형