[Swift] Protocol/Delegate 알아보기

Yi Joon Choi·2021년 10월 10일
0

Road To iOS Developer

목록 보기
3/3

1. Protocol이란?

  • Protocol == 규약
  • 서로간의 지켜야 할 약속
  • 알바생의 메뉴얼이라고 생각하면 된다

    UITableViewDataSource 라는 프로토콜 안에 cellForRowAt, numberOfSections... 등등 함수가 정의되어있는것을 볼 수 있다.

그런데 프로토콜에서는 정의만 되어있고 직접적인 구현은 하지 않는다 왜?

모든 가능성을 생각하기 어렵기 때문이다! 이제 알아보도록 하자!

예를 들어서, 선생님 프로토콜이 있다고 치면 그 안에 있는 함수들은 뭐뭐가 있을까?

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에 선언한 그대로 적어야한다.

2. Protocol Requirements

  • 프로토콜 내 프로퍼티를 요구할 때 반드시 var로 작성해야 하며
  • get(읽기전용)/set(읽고 쓰기 전용) 이 가능한지 명시해야 한다 (안하면 오류발생!)

Delegate 란?

  • Delegate == 대리자
  • Protocol →알바생이 따라해야 하는 메뉴얼 Delegate → 그 메뉴얼을 따라야 하는 알바생!

3. Delegate Pattern

  • 애플에서 delegate는 controller에 역할을 위임할때 많이 사용된다
  • 우리는 MVC패턴을 지금 주로 쓰고 있기 때문에 view의 역할은 오직 사용자의 action을 알려주는 역할만 하고 그 action을 어떻게 처리할지는 controller에게 위임해주는 것이다.

4. 예시로 알아보는 delegate 사용 순서

  1. 데이터를 넘겨주는 뷰
    1. 프로토콜 생성
    2. 위에 생성해준 프로토콜 타입을 가진 delegate 프로퍼티 생성
    3. delegate프로퍼티 사용
  2. 데이터를 받는 뷰
    1. 프로토콜 채택
    2. 프로토콜 내의 함수를 직접 구현
    3. delegate위임
profile
최이준

0개의 댓글