Delegate - 대표자(명사)또는 위임하다(동사).
Delegation(위임)
- 클래스나 구조체가 일부 책임을 다른 유형의 인스턴스로 전달 또는 위임 할 수 있도록 하는 디자인 패턴이다.
- 위임된 기능은 프로토콜에서 정의하며, delegate가 위임된 기능을 제공한다.
- 위임은 특정 작업에 응답하거나 외부에서 데이터를 가져오는데 사용할 수 있다.
- delegate로 선언된 객체1은 자신을 임명한 객체2가 일을 도와달라고 하면 지정된 메서드를 통하여 처리해준다.
- 객체1 - 보통 내가 만든 클래스를 의미한다.
- 객체2 - 테이블뷰, 피커뷰 등
- 보통 protocol을 사용한다.
Delegate 패턴
- 하나의 객체가 모든 일을 처리하는 것이 아니라 처리해야 할 일 중 일부를 다른 객체에 넘기는 것을 의미한다.
Protocol(프로토콜)
- 특정 클래스와 관련없는 함수(메서드)들의 선언 집합을 의미한다.
- *함수(메서드)에 대한 정의는 없으며, 기능이나 속성에 대한 설계도로 생각하자
- protocol은 상속 받는다가 아닌 채택 한다고 표현한다.
- POP - Protocol Oriented Programming
- 프로토콜 단위로 묶어 표현하고, extension으로 기본적인 것을 구현해서 단일 상속의 한계를 극복할 수 있다.
사용 방법
- protocol 프로토콜명{ 메서드 선언 } //메서드는 선언만 있다.
- protocol 프로토콜명 : 부모1 프로토콜, 부모2 프로토콜 //프로토콜은 다중 상속도 가능하다.
- class 클래스명:부모명, 프로토콜명1,프로토콜명2 { }
- class 클래스명:프로토콜명{ }
- 부모가 없다면 바로 protocol을 표기 가능하다.
클래스, 구조체, 열거형, extension에 프로토콜을 채택(adopt) 할 수 있다.
protocol과 프로퍼티/메서드 선언
protocol choProtocol{
var x : Int {get set} //읽기와 쓰기 모두 가능
var y : Int {get} //읽기만 가능
static var tx : Int {get set}
static func typeMethod()
func random() -> Double
}
protocol 정의, 채택, 준수 예시
protocol Runnable{ //대리하고 싶은 함수 목록 작성
var x : Int {get set} //읽기와 쓰기가 가능한 프로퍼티
func run() //메서드는 선언만 한다.
}
class Man : Runnable{ //protocol채택
var x : Int = 1 //프로퍼티 준수
func run(){ //함수 준수
print("\(x),사람")
}
}
var cho = Man()
print(cho.x) //1
cho.run() //1, 사람
주로 ViewController클래스는 부모 UIViewCOntroller를 상속 받고, UIPickerVIew형의 인스턴스 pickerImage를 선언하고 피커뷰 인스턴스를 사용하기 위해 프로토콜 UIPickerViewDelegate와 UIPickerViewDataSource를 채택한다.
*class ViewController : UIViewCOntroller, UIPickerViewDelegate, UIPickerViewDataSource{ }
class ViewController : UIViewCOntroller, UIPickerViewDelegate,
UIPickerViewDataSource{ @IBOutlet var picker Image : UIPickerView!...
프로토콜 UIPickerViewDelegate와 UIPickerViewDataSource의 필수 메서드는 모두 구현해야 프로토콜을 준수한다(conform).
인덕대학교 한성현 교수님의 강의를 참고하였습니다.
'iOS_Swift > 문법 정리' 카테고리의 다른 글
Swift - 구조체(struct) (0) | 2022.05.11 |
---|---|
Swift - 열거형(enum) (0) | 2022.05.10 |
Swift - 접근제어(access control, access modifier) (0) | 2022.05.08 |
Swift - extension (0) | 2022.05.06 |
Swift - 초기화 designated Initializer, convenience Initializer (0) | 2022.05.04 |