[swift] 삽화를 통해서 알 수 있어요!구체적인 Delegate 사용 방법
※ 델게이트의 사용법을 이해하는 데 중점을 두기 때문에 델게이트의 본래 사용법을 알고 싶은 사람에게는 적합하지 않습니다.
이 목적으로만 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()
}
}
Delegateprotocol 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
Delegateprotocol 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를 사용하는 가장 큰 장점은
협의와 위임에 관한 매우 간단한 견본
제가 이 보도를 참고하도록 허락해 주십시오
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()
}
}
Delegateprotocol 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
Delegateprotocol 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를 사용하는 가장 큰 장점은
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)
}
}
}
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()
}
}
protocol TestDelegate: class {
func test()
}
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を設定
var testdelegate: TestDelegate?
//子(DelegateTableView)の設定しているdelegateを自身にもセット
delegateTableView.testdelegate = self
protocol TestDelegate: class {
func test()
}
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 로 구분해 보았다
delegate를 사용하는 가장 큰 장점은
하지만 조금만 참고해 주시면 좋겠어요.
지적사항이 있으면 댓글로 남겨주세요.
Reference
이 문제에 관하여([swift] 삽화를 통해서 알 수 있어요!구체적인 Delegate 사용 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/chanNaru/items/326bd50a78cf34371169텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)