Delegate
: 대리자, 조력자라는 사전적 의미를 가지고 있다.
과연 무슨 소리일까?
객체 지향 프로그래밍에서 하나의 객체가 모든 일을 처리하지는 않는다.
delegate은 바로 처리해야 할 일들 중 일부를 다른 객체에 넘겨주는 역할을 한다.
delegate 사용법
- class가 delegate을 채택한다.
- 위임자를 설정한다.
- 그 delegate 안에 메서드를 구현한다.
Delegate는 해당 클래스에서 위임자로 등록한 객체에서 메서드에 따른 이벤트가 발생하면 호출된다.
TableView로 예시를 들어보자.
- ViewController 클래스가 UITableDelegate을 채택
- 프로퍼티로 선언된 tableView를 delegate 선언
- delegate 안에 메서드 구현(e.g. TableView의 Cell 클릭 시 다음 View로 넘어감)
Delegate은 프로토콜로 구현된다. => Delegate을 알려면 프로토콜을 알아야 한다.
프로토콜(Protocol)
특정 클래스와 관련없는 프로퍼티, 메서드의 선언 집합
기능이나 속성에 대한 설계도 느낌이라 메서드에 대한 정의는 없다.
클래서(구조체, 열거형,extension)에서 채택(adopt)해서 메서드를 구현해야 한다. (상속X)
class 클래스명:부모명, 프로토콜명1{}, 프로토콜명2{}
- 부모 클래스는 하나만 가능하기에, 여러개가 붙어있다면 나머지는 프로토콜이다.
protocol 정의
protocol 프로토콜명{
프로퍼티명
메서드 선언
}
protocol 프로토콜명 : 다른프로토콜, 다른프로토콜2{
//프로토콜 끼리도 채택이 가능함
}
예시)
protocol Runnable {
var x : Int {get set} //읽기, 쓰기 가능한 프로퍼티, {get}은 읽기 전용
func run() //메서드는 선언만!!!
}
class Man : Runnable { //채택(adopt)
var x : Int = 1
func run(){print("RUN!!)} //클래스에서 구현되는 메서드
}
프로토콜의 필수 메서드는 반드시 구현되어야 한다. -> 이를 프로토콜을 준수(conform)한다고 한다.
해당 프로토콜은 클래스 내에서 필요할 경우에 구현한다.
Required!
해당 프로토콜은 클래스 내에 반드시 구현한다.
* extension을 활용하자
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{}
-> 소스가 지저분함
class ViewController: UIViewController{}
extension ViewController: UIPickerViewDelegate{}
extension ViewController: UIPickerViewDataSource{}
-> Better!
'iOS > Swift이론' 카테고리의 다른 글
UIKit (0) | 2022.05.23 |
---|---|
Swift) 열거형 enum (2) | 2022.04.19 |
Swift) 클래스와 메서드 (3) | 2022.03.30 |
[iOS]Swift 구조체 (0) | 2022.03.22 |
[iOS]Swift 함수 (0) | 2022.03.17 |