[swift] 삽화를 통해서 알 수 있어요!구체적인 Delegate 사용 방법

디프 Advent Calendar 2016, 23일째.(ω・)승낙하다

※ 델게이트의 사용법을 이해하는 데 중점을 두기 때문에 델게이트의 본래 사용법을 알고 싶은 사람에게는 적합하지 않습니다.
이 목적으로만 m(__)를 열람하십시오.m
많은 swift 초보자들이 고전하는 Delegate.
일단 제일 먼저 부딪힌 벽이라고 할 수 있겠지.
저도 그중의 하나예요.
이해하기 어려운 Delegate 기사들이 굉장히 많습니다.
"이해하기 쉬워! 간단해! Delegate"기사를 모두 봐도 이해하기 어려워요...orz
(이건 내 이해력의 문제야...)
그래서
세상에 넘치는 알기 쉬운 Delegate의 설명을 봐도 이해가 안 되는 저
나는 삽화로 더 쉽게 이해하고 싶다. 델게이트의 기본을 쓰고 싶다.

1.도대체 왜 이해가 안되지?


우선, 왜 Delegate를 이해하기 힘들지.
단도직입적으로 말하면, 결국
"그럼, 뭘 할 수 있을까요?😰😰」
"사용하는 곳을 몰라요.😰😰」
이런 곳에 도착한 것 같지 않아요?
그러면 결국
샘플 코드를 보면 어떻게 썼는지 알 수 있다. 응(하지만 자신은 유용할 수 없다).
= 이해할 수 없다
그래서 그곳을 풀 필요가 있다.

Delegate란 무엇입니까?


협의와 위임에 관한 매우 간단한 견본
제가 이 보도를 참고하도록 허락해 주십시오
Delegation is a design pattern that enables a class or structure to hand off(or delegate) some of its responsibilities to an instance of another type.
(The Swift Programing Language 레코드)
= "델리멘은 디자인 모델입니다."
"응, 디자인 모델이 뭐야?😰」..그래서 이곳은 사랑을 끊는다.
결과 Delegate
"한 클래스는 다른 클래스에 처리를 의뢰할 수 있는 실례입니다."
물건이지만
어쨌든'두 반 사이가 처리를 뛰어넘었구나.😃」얼마 안 남았으면 됐어.

3. 구체적인 예


우선 구체적인 사용 방법을 보고 싶습니다.
이번에는 Delegate를 더 잘 이해하기 위해
"Delegate 를 사용하는 경우", "사용하지 않는 경우"두 가지 모드로 설명하고 싶습니다.

제작


이런 거.

구조로서 이런 느낌입니다.
이 페이지의 부모님은 View Controller죠?

차원 차이


이 두 가지 모델은 이번 상황에서 학급 구성의 가장 큰 차이점이다
tableView가 상위 ViewController 클래스에서 작성되었는지 여부에 차이가 있습니다.

■ Delegate 없음



■ Delegate 있음



눌린 점


※ 해설하기 전에 눌러야 할 것들.
이번 샘플
tableViewCell을 클릭하면 페이지가 이동됩니다.
그 페이지에서 다른 페이지로 이동하는 것이다.
그러니까
페이지를 만든 부모 세대는 다른 페이지로 이동하는 작업을 수행해야 합니다.
여기가 중요해.

출처 차이


먼저 각 Delegate와 관련된 부분의 쓰기 방법이 다른 부분을 기록합니다.
다음 두 개는 완전히 같은 처리 부분이다.
구체적으로 말하면 didSelectRowAt indexPath:의 작법은 차이가 있다.didSelectRowAt indexPath:는 TableView에 있는cell을 클릭했을 때 부르는 방법입니다.

■ Delegate 없음


상위 세대(ViewController)
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!

    //〜省略〜

    // MARK: - UITableViewDelegate
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)

        guard let url = URL(string: "https://www.youtube.com/watch?v=GNIkcjccZlw") else {
            return
        }

        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [], completionHandler: nil)
        }
    }
}

■ Delegate 있음


하위 세대(DelegateTableView)
class DelegateTableView: UITableView, UITableViewDataSource, UITableViewDelegate {

    //delegateを設定
    var testdelegate: TestDelegate?

    //〜省略〜

    // MARK: - UITableViewDelegate
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.deselectRow(at: indexPath, animated: true)

        self.testdelegate?.test()
    }
}
Delegate
protocol TestDelegate: class {

    func test()
}
상위 세대(ViewController)
class ViewController: UIViewController, TestDelegate {

    @IBOutlet weak var delegateTableView: DelegateTableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        //子(DelegateTableView)の設定しているdelegateを自身にもセット
        delegateTableView.testdelegate = self
    }

    func test() {
        guard let url = URL(string: "https://www.youtube.com/watch?v=GNIkcjccZlw") else {
            return
        }

        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [], completionHandler: nil)
        }
    }
}

이미지 맵


위의 처리는 그림으로 이런 상황을 나타낸다.

■ Delegate 없음



■ Delegate 있음





득점


전달 변수


하위 세대(DelegateTableView)
//delegateを設定
var testdelegate: TestDelegate?
상위 세대(ViewController)
//子(DelegateTableView)の設定しているdelegateを自身にもセット
delegateTableView.testdelegate = self
자신도 다른 종류에 정의된 변수를 가지고 있다
나는 그delegate를 처리할 수 있다.
이 부근의 인수인계가 틀리지 않도록 주의하세요.
※ 이 = self가 상속되지 않을 경우TestDelegate ErrordelegateTableView.testdelegate = self as! TestDelegate, 우리도 주의해야 한다.

protocol


Delegate
protocol TestDelegate: class {

    func test()
}
protocol (名前), 상속 가능.

또한 원래 swift에서 갖추었던UITableViewDelegate계승할 때 cellForRowAt indexPath:, numberOfRowsInSection section: 두 가지 방법을 쓰지 않으면

이런 오류가 나겠죠.
이와 마찬가지로 상술한 예에서
계승 testDelegate 클래스에 func test() 을 쓰지 않으면 오류가 발생합니다.

지원


추적 처리가 쉬운 방법으로도 논의용extension이 있다.
class ViewController: UIViewController {
    @IBOutlet weak var delegateTableView: DelegateTableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        //子(DelegateTableView)の設定しているdelegateを自身にもセット
        delegateTableView.testdelegate = self
    }
}

extension ViewController: TestDelegate {
func test() {
        guard let url = URL(string: "https://www.youtube.com/watch?v=GNIkcjccZlw") else {
            return
        }

        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [], completionHandler: nil)
        }
    }
}

처리 위치


아까 말씀드렸듯이'눌린 점'처럼.
화면 마이그레이션 처리의 경우
guard let url = URL(string: "https://www.youtube.com/watch?v=GNIkcjccZlw") else {
    return
}

if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [], completionHandler: nil)
}
에서 기술한 장면은 다음과 같은 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 부피를 분석하도록 한다.
거기는 Delegate를 사용하지 않을 뿐만 아니라 변화도 없습니다.

4. 요약


이번에는 조금 이해하기 쉽도록 유무 Delegate 로 구분해 보았다
delegate를 사용하는 가장 큰 장점은
  • 양도 목적지를 의식할 필요가 없음
  • 재사용 가능
  • 따라서 좋은 실감은 좋지 않은 샘플일 수도 있다.웃다
    하지만 조금만 참고해 주시면 좋겠어요.
    지적사항이 있으면 댓글로 남겨주세요.

    좋은 웹페이지 즐겨찾기