세계에서 가장 이해하기 쉬운delegate 입문

입문


나는 Swift를 배우기 시작한 사람이 가장 먼저 넘어진 곳이 델리멘이라고 생각한다.지금 Swift라고 쓰는 사람도 처음에 delegate를 조사하는 데 상당한 시간이 걸렸죠.이렇게 말한 나도 델게이트가 막히고 델게이트 주변의 다양한 직장에서 일한 사람 중 한 명이다.그런 사람이 한 명 빠지게 하기 위해서 나는 이 기사를 쓴다.
※ 제목은 과장된 표현입니다(웃음)
하지만 이 기사를 보고 다른 기사를 볼 필요가 없는 수준으로 간단명료하게 쓰려고 한다.

프로토콜


delegate를 기억하기 전에 전제로 Swift에 대해 알고 싶습니다.솔직히 이거 읽은 사람한테 전달하면 이 기사의 의미가 이루어진다고 생각해요.

Swift는 프로토콜을 위한 언어입니다.


Swift는 개체를 대상으로 작성할 수 있습니다.클래스를 정의하고, 이 클래스를 계승하는 하위 클래스를 만들고, 클래스를 만드는 실례를 만들고, 그 방법을 호출합니다...
그러나 애플은 Swift를 대상 언어라고 부르지 않았다.
사과는 이렇게 말했다."Swift는 프로토콜을 위한 언어입니다."

계약 역할


다른 언어를 배운 사람들이 이미지를 쉽게 파악할 수 있도록 쓰면 프로토콜(protocol)은 추상적인 클래스와 인터페이스라고 불리는 것과 같다.다음은 코드를 표시하면서 설명합니다.
먼저 Animal이라는 프로토콜을 정의합니다.
AnimalDelegate.swift
protocol Animal {
    func cry()
}
이 협의의 의미로'애니멀 협의의 내용은 반드시cry방법이 실현되고 있다'고 생각해 주십시오.
이외에도 Dog반이 있다고 가정해 보세요.안에 아무것도 안 썼어요.
Dog.swift
class Dog {

}
이 코드는 순조롭게 컴파일할 수도 있고 실행할 수도 있다.(내용이 없는 반만 정의했기 때문에 틀리지 않았다...웃음)
근데 잘 생각해봐.개는 동물이죠?따라서 Dog 클래스는 Animal 프로토콜을 따른다고 다시 한번 선언합니다.
Dog.swift
class Dog: Animal {

}
이 코드를 컴파일하는 중 오류가 발생했습니다.애니멀 프로토콜의 클래스에 따라cry방법을 실현해야 하는데 이cry방법이 없기 때문이다.따라서 Dog 클래스에서cry 방법을 다시 실시합니다.
Dog.swift
class Dog: Animal {
    func cry() {
        print("wan!")
    }
}
이렇게 하면 틀리지 않을 것이다.이른바 협의
"○○ 클래스에 △△메서드가 설치되어 있다는 점은 이해하기 쉽습니다."
역할

삭제문


위의 프로토콜 설명부터 시작하는 이유는 delegate를 사용하려면 프로토콜을 설명해야 하기 때문입니다.다음은delegate의 설명에 들어갑니다.

역할 삭제


다음은delegate를 사용하는 코드 예시입니다.
Main.swift
var delegate: Animal!

delegate = Dog()
delegate.cry()
Swift에서는 변수의 클래스를 설명하기 위해 변수 이름 뒤에 다음을 추가할 수 있습니다.그러나 실제로는 클래스에서 성명할 수 있을 뿐만 아니라 협의에서도 성명할 수 있다.위의 코드는 Animal 프로토콜에 맞는 변수delegate를 설명합니다.그리고 성명 후에 Dog류의 실례를 만들어delegate를 대입합니다.Dog류 성명이 Animal 프로토콜에 부합하기 때문이다.마지막으로 Animal에 맞는 클래스는cry 방법을 실현해야 하기 때문에 변수delegate에서cry를 호출할 수 있습니다.
따라서 위의 코드를 컴파일하고 실행할 때 표준 출력은 다음과 같다.
wan!
어때요?프로토콜을 알게 된 토대에서 위의 코드를 읽으면 쉽게 읽을 수 있을 거예요.요약하자면, Main.swift에서cry를 실현하는 방법은 없지만,delegate에서 이미 실현되었다는 것을 알고 있기 때문에 그것을 불러도 됩니다.
참고로 Cat 클래스를 선언하면 출력 결과도 변경할 수 있습니다.
Cat.swift
class Cat: Animal {
    func cry() {
        print("nya-")
    }
}
Main.swift
var delegate: Animal!

delegate = Dog()
delegate.cry()
delegate = Cat()
delegate.cry()
결과:↓
wan!
nya-!
그래서 이른바 delegate
지정한 프로토콜만으로 변수 (실례 등) 의 기능을 가질 수 있다
만약 변수 안에 존재하는 방법을 알고 있다면, 밖에서 이 방법의 기능을 호칭할 수 있다
의 총체.

자주 사용하는delegate의 예


delegate의 전체적인 상황을 파악하여 iOS 프로그래밍에서 자주 등장하는delegate의 예를 소개하고자 합니다. 이해를 깊이 있게 하고자 합니다.
delegate를 자주 사용하는 예에서 가장 흔히 볼 수 있는 예는 UITableView입니다.이것은 0 일람 화면 등에서 자주 나타나는 스크롤 보기 칸의 화면이다.

이러한 UITableView의 예제 코드는 다음과 같습니다.
ViewController.swift
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    var tableView: UITableView!

    override func viewDidLoad() {
        tableView = UITableView()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UINib(nibName: "SampleCell", bundle: nil), forCellReuseIdentifier: "cell")
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! SampleCell
        return cell
    }
}
UITableView를 만들 때의 코드를 대충 썼습니다.
Apple 문서를 보면 알 수 있습니다. 전제 조건은 UITableView 클래스가 원래 두 가지 변수를 설명했습니다:delegate와 dataSource.그리고 UITableView 클래스는 인스턴스가 작성될 때 dataSource에 설치됩니다.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
, tableView의 셀 수를 결정합니다.
또한 화면에 표시할 장치가 있을 때 dataSource에 설치
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
문서 레지스트리에 항목을 추가합니다.
다음은 실제delegate를 사용하는 부분입니다.나는 직감이 좋은 사람들이델게이트가 어느 부분에서 사용되었는지 알아차렸다고 생각한다. 델게이트가 사용된 부분은 다음과 같다.
tableView.delegate = self
tableView.dataSource = self
이렇게 하면,self(자신)를delegate에 대입할 수도 있다.참고로 UITableView의delegate는 UITableViewDelegte 협의를 따라야 하고 데이터소스는 UITableViewDataSource 협의를 따라야 하기 때문에ViewController의 성명 부분에 이러한 협의를 준수한다고 명확하게 기재되어 있습니다.(이것이 없으면 실수할 것이다.)
이렇게 함으로써
DataSource 메서드가 호출될 것 같습니다.

dataSource 설정

자신의 방법은
이렇게 하면 방법이라고 불리는 내용을 마음대로 실현할 수 있다.iOS에서 Apple이 UIKIT를 통해 호칭하는 방법을 실현한 곳은 있지만 방법의 내용 자체가delegate로 다른 실례에 의뢰되는 경우가 빈번하다.이런 제작이 델게이트다.(위의 예에서 셀 수와 셀 내용을 결정하는 처리 자체는 dataSource에 맡긴다.)이렇듯 처리라고 하지만 처리 내용 자체가 외부에 위탁되어 있기 때문에delegate(위탁, 양도)라고 불린다.

총결산


Swift의 중심 사상에 대한 협의에 대한 설명으로 들어가서delegate가 무엇인지 설명하고 사용하는 예를 소개했다.읽는 사람이delegate의 방법을 발견했을 때,delegate를 사용한다고 생각했으면 좋겠어요.기본적으로 방법이 실현되었지만 호칭할 곳을 찾기 어렵다면 그게 델게이트라고 생각합니다.처음에는 다양한 반을 오가며 고민하는 것이 힘들 수도 있지만 익숙해지면 편리한 기능이라고 생각하니 힘내세요!!

잡담


사실 저는 그 다음에 프로토콜 extension과optional method에 관한 글을 한 편 더 쓰고 싶은데 프로토콜과delegate의 설명이 의외로 길어져서 기사를 바꾸고 싶습니다.기대해주세요!!

좋은 웹페이지 즐겨찾기