[iOS - swift] protocol 심화 - (protocol 응용, existential any, generics, cannot conform to 'Hashable', 의존성 분리)

1. 프로토콜

어떤 기능에 적합한 특정 메서드, 프로퍼티 및 기타 요구 사항의 청사진(Bluprint)을 의미합니다

프로토콜은 클래스, 구조체, 열거형에 의해 채택되며, 프로토콜에 정의된 요구사항의 실제 구현을 제공합니다

프로토콜의 요구 사항을 모두 충족하는 모든 유형(클래스/구조체/열거형)은 해당 프로토콜에 부합하다고 합니다.

라는 애플의 공식문서인데, 소들님이 예시를 들어준 것처럼 저도 솝트식으로 예시를 들어보겠습니다!!

자 우리가 솝트를 하게 된다면 필수적으로 있어야 되는 게 무엇이 있을까요?

각 파트의 대표인 파트장 세미나를 진행하는 장소 그리고 파트 마지막에 결정되는 MVP 등이 있을 것입니다.

또한 우리는 세미나 수업을 듣고, 세미나 과제를 하고, 앱잼을 하게 됩니다. (물론 필수는 아니지만, 이건 뒤에서 설명)

그래서 우리는 솝트에 어떤 파트든, 어떤 기수든 이것들을 지켜야 돼! 라는 약속을 만들고 싶습니다.

즉 프로토콜은 우리 파트장은 누구고, 어디서 세미나를 할거고, 이번 수업은 어떤거고 주저리주저리~~~ 설명이 아닌

파트장, 세미나 장소, MVP는 필수로 필요하고, 세미나 수업, 세미나 과제 등도 해야돼 라는 약속을 정해주는 겁니다.!!

조금 이해가 가시나요? 아래 코드로 한번 살펴보죠

2. 프로토콜 활용

2-1. 프로토콜 정의

위에서도 언급한 것처럼 프로퍼티를 선언하여 값을 직접 정의하고, 메서드를 직접 구현 하는 것이 아님! JUST 선언만 하면 된다!

protocol Sopt {
    var partLeader: String { get set }
    var seminaPlace: String { get set }
    var mvp: String { get set }
    
    func semina()
    func assignment()
}

2-2. 프로토콜 채택

우리는 이런 약속들이 담긴 프로토콜을 지킬 수 있는 솝트 내 파트들에게 이제 프로토콜을 채택할 것입니다. ⇒ 즉 이제 프로토콜에 선언된 내용들을 → 정의하고 구현하는 것이겠쬬? 만약 안되어있으면 → 에러가 납니다! (약속 지킨다고 했짜나!!!!!!!)

프로퍼티/메서드에 대한 껍데기만 제공하되, 실제 구현은 채택한 곳에서 하는 것임!!

클래스, 구조체, 열거형에서 채택이 가능하다~