이번 편의 목표: 연체료 계산에 필요한 함수만 프로토콜로 약속하고, 구조체와 클래스가 그 약속을 채우게 합니다.
프로토콜은 타입이 제공해야 하는 멤버의 목록입니다. 구현은 프로토콜에 없고, 그 프로토콜을 채택한 타입에 있습니다. 함수는 채택한 타입을 몰라도 프로토콜만 받고 호출할 수 있습니다.
protocol FeePolicy {
func fee(days: Int) -> Int
}
struct PaperFee: FeePolicy {
func fee(days: Int) -> Int {
days * 100
}
}
final class VideoFee: FeePolicy {
func fee(days: Int) -> Int {
days * 300
}
}
func printFee(_ policy: any FeePolicy, days: Int) {
print(policy.fee(days: days))
}
printFee(PaperFee(), days: 3)
printFee(VideoFee(), days: 3)출력은 300과 900입니다. any FeePolicy는 채택 타입이 실행 중에 정해지는 값입니다. PaperFee와 VideoFee를 한 배열에 넣으려면 [any FeePolicy]라고 적습니다. 프로토콜에 구현이 없는 함수를 채택 타입에서 빠뜨리면 컴파일이 멈춥니다.
스위프트 6.2부터는 메인 액터에 묶인 타입이 메인 액터 밖에서 만들어진 프로토콜을 채택할 때, 그 채택 자체가 메인 액터에 묶일 수 있습니다. 화면 모델이 FeePolicy를 채택한다면 그 모델의 메서드는 메인에서만 호출됩니다. 격리의 기본값은 10편에서 프로젝트 설정으로 다룹니다. 이 편의 예제는 터미널에서 바로 실행되는 순수 계산입니다.
직접 해 보기
하루 50원인 연체 정책을 구조체로 하나 더 만들어 printFee에 넘기고, 2일의 결과가 100인지 확인하세요.
해설
days * 50에 2를 넣으면 100입니다. printFee의 매개변수 타입은 계속 any FeePolicy입니다. 새 구조체가 fee를 구현하면 그 함수에 바로 넘길 수 있습니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.