뷰를 전환하며 데이터를 전달하는 방식은 크게 2가지로 나뉩니다.
바로 직접 전달과 간접 전달이죠!
▶️ Segue prepare 메소드를 통해 전달하는 방식
▶️ Property에 접근해서 전달하는 방식
그 중 Delegation을 통해 전달하는 방식은 직접 전달 방식에 해당합니다.
오늘은 요 Delegation을 통한 데이터 전달 방식을 공부해보려고 합니다.
그렇기 위해서는 Protocol과 Delegate 패턴에 대해 미리 공부를 해야 합니다.
📚 Protocol과 Delegate Pattern
Delegate는 Protocol 형태로 구현되기 때문에 이 둘은 뗄래야 뗄 수 없는 관계래요!
< 프로토콜 >
그렇다면 프로토콜은 뭘까요?
한마디로 말하자면 메뉴얼/설명서 에요!
메뉴얼을 보면 어떻게 하라고만 써있지 메뉴얼 자체가 완성품은 아니잖아요?
프로토콜도 마찬가지입니다.
프로토콜 내부에 필요한 부분을 정의합니다.
예를 들어, 프로퍼티, 메소드, 이니셜라이저 등의 요구사항 등을 적는 거죠.
단순히 적어둡니다. 아래 코드처럼 함수가 이름만 있고 구현 부분은 없죠?
이렇게 프로토콜은 단순 나열을 하고 구현 내용은 추후에 프로토콜을 채택하는 곳에서 작성해주게 됩니다.
⚠️ 프로토콜 내 프로퍼티를 요구할 때 반드시 var로 작성해야 하며
⚠️ get(읽기전용) / set(읽고 쓰기 전용) 이 가능한지 명시해야 합니다 -> 안하면 오류발생
< 프로토콜 채택 >
- - 구조체, 클래스, 열거형 모든 타입에서 가능합니다.
- - 채택 방식은 콜론을 적고 옆에 프로토콜 이름을 적어주면 됩니다.
- - 프로토콜 채택은 여러개를 동시에 해도 가능합니다!
- - 클래스에서 상속과 채택을 동시에 해주려면 클래스 -> 프로토콜을 작성해줘야 합니다.
위에서도 말했다시피
프로토콜을 채택해주면 프로토콜이 원하는 기능들에 대한 구현이 이루어져야 합니다.
그리고 그 기능 구현은 채택해준 곳마다 다릅니다.
< 델리게이트 >
위임하다/대리하다는 뜻의 delegate는 무언가를 대신하다는 뜻으로 받아들이면 될 것 같아요.
어떤 것의 일을 가져와 대신해주는 것!입니다.
객체지향 프로그래밍에서 하나의 객체가 모든 일을 하는 것이 아니라
처리해야 하는 일 중 일부를 다른 객체에게 위임하는 것을 의미합니다.
사실 말로만 설명하면 잘 이해가 안가니
델릭게이트 패턴을 통한 데이터 전달을 통해 좀 더 알아보도록 해요!
📚 델리게이트 패턴을 통한 데이터 전달
자! 그럼 우선 스토리보드를 하나 만들어줍시다!
저는 네비게이션 컨트롤러로 embed 해줬습니다.
첫 번째 뷰컨에는 - button, 데이터를 전달받아 표시해줄 label
두 번째 뷰컨에는 - button, 데이터를 입력할 textField 를 올려서 @IBAction, @IBOutlet을 걸어주었습니다.
✅ 두 번째 뷰 컨트롤러 = 데이터를 전달해주는 뷰
1️⃣ - [ SampleProtocol ] protocol 생성 (함수 원형만 작성 / 구현부는 작성 X)
2️⃣ - 위에 생성해준 프로토콜 타입을 가진 delegate 프로퍼티 생성
3️⃣ - delegate 프로퍼티 사용
[ delegation으로 데이터 전달 ] 이라는 버튼을 눌러주면
dataTextField.text가 옵셔널 바인딩을 통해 nil 이 아님을 증명하면 text에 값을 저장하고
delegate 프로퍼티의 dataSend 함수를 불러와 data파라미터에 text(이 text는 dataTextField.text임)를 담아줍니다.
✅ 첫 번째 뷰 컨트롤러 = 데이터를 전달받는 뷰
1️⃣ - [ SampleProtocol ] protocol 채택
아마 프로토콜을 채택해주면 분명 오류가 뜰 거에요!
왜냐하면 프로토콜 내 dataSend라는 함수를 구현해주지 않았기 때문에 구현하라는 오류가 뜰 거에요!
오류 메시지의 Fix 버튼을 클릭하면 함수가 자동으로 생기고 내부에 우리가 원하는 기능을 구현해주면 됩니다!
2️⃣ - protocol 내의 [ dataSend ] 함수를 실제로 구현
[ dataSend ] 함수에서 data파라미터 (왜냐면 두 번째 뷰컨에서 여기에 dataTextField.text를 담아줬음) 를 받아서
dataLabel.text로 넣어주면 데이터 전달 완료!입니다.
3️⃣ - delegate 위임 ( nextVC.delegate = self )
[ nextVC.delegate = self ] 는
두 번째 뷰컨에서 선언한 delegate 프로퍼티(SampleProctocol 타입)를
대신해 처리하는 게 바로 첫 번째 뷰컨이라는 뜻입니다.
✋🏻 결과 화면 🤚🏻
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] Alamofire를 통해 서버와 통신 해보기 - GET (4) | 2021.05.14 |
---|---|
[Swift] 싱글턴 패턴 : Singleton Pattern이란? (0) | 2021.05.14 |
[iOS] 데이터 직접 전달 방식(2) - Segue prepare 메소드를 통해 전달 (1) | 2021.04.29 |
[iOS] 데이터 직접 전달 방식(1) - Property를 통해 전달 (1) | 2021.04.29 |
[Swift] 클래스(Class) /구조체(Struct) /열거형(Enum) 정리 + 차이점 (2) | 2021.04.29 |