그런데 프로토콜에서는 정의만 되어있고 직접적인 구현은 하지 않는다 왜?
→ 모든 가능성을 생각하기 어렵기 때문이다! 이제 알아보도록 하자!
예를 들어서, 선생님 프로토콜이 있다고 치면 그 안에 있는 함수들은 뭐뭐가 있을까?
protocol Teacher{
var subject : String { get set }//과목
var homeroom : String { get set }//담당반
func teach() //가르치다
func giveHomework() //숙제를 내주다
}
프로토콜에서는 이름과 타입 그리고 gettable, settable한지 명시한다 (프로퍼티는 항상 var로 선언해야 한다)
지구에는 국어선생님도 있고 수학선생님도 있고 영어선생님도 있을텐데... 그러면 그 선생님들이 나올때마다 항상 프로토콜을 새로 만들어줘야 하는거야?
→ 그렇게 안하려고 프로토콜/델리게이트 패턴을 쓰는 것이다...
모든 가능성을 생각하기 어렵기 때문에, 구현은 Teacher프로토콜을 채택한 곳에서 이루어진다!
struct Kim : Teacher{
var homeworkPgs : Int = 10
var subject : String = "수학"
var homeroom : String = "3반"
func teach(){
print("와 진짜 명강의")
}
func giveHomework(){
homeworkPgs += 10
}
}
print(Kim.subject)
print(Kim.homeroom)
print(Kim.teach())
Kim.giveHomework()
//결과값 한번 맞춰봐...
프로토콜을 채택한 이후로 가끔 이렇게 빨간색으로 오류가 뜨는 경우가 있다!
"FirstViewController가 DeliveryDataProtocol을 준수하지 않는다"
이는 프로토콜에 있는 모든 것을 구현하지 않았기 때문에 생기는 에러라고 한다.
여기서 주의해야할 점은 protocol에 선언한 그대로를 구현해야한다는 것이다.
여기서 parameter이름이 달라지거나, 타입이 달라진다면 다른 메서드로 인식을 하기 때문에 무조건 protocol에 선언한 그대로 적어야한다.