Swift/개념 & 응용

[Swift] 프로토콜 메서드의 매개변수 기본 값 설정 (Defining default parameters for protocol methods)

유정주 2024. 2. 24. 16:25
반응형

서론

프로토콜 타입을 사용할 때 불편한 점이 하나 있습니다.

메서드 파라미터에 기본 값을 사용할 수 없다는 점입니다.

 

예를 들어, 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


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형