본문 바로가기

iOS/Deep dive!!!

[iOS] super 클래스에서 발생되는 delegate! sub class의 delegate로 한번에 처리하기 | Base view #1

 

안녕하세요. 벌써 수확의 계절이 왔네요. (전 이제부터 시작인데,,🌻 ㅎㅎ)

 

요즘은 앱 개발을 할 때 어떻게 공통적인 코드들을 줄일 수 있고 쉽게 활용할 수 있을지를 고민하며 개발을 합니다.

 

오늘은 view 타입의 Base(super) class에서 선언한 delegate와, base class를 상속받은 sub class에서 어떻게 sub class에서 추가적으로 발생하는 또 다른 delegate를 super class의 delegate와 같이 sub class의 한 개의 프로퍼티에서 수행할 수 있는지 해결 과정을 글로 작성하려고 합니다: ]

 

공통 뷰와 BaseDelegate를 구현하게 된 상황

 

지금 개발중인 "여행을 가다" 앱에서는 위와 같은 컴포넌트들이 있습니다. 제가 생각했을 때 이 사진에서 공통적인 컴포넌트들 특징은 아래와 같습니다.

 

빨간색 영역입니다 +_+

 

 

한번 더 표시를 했습니다. 빨간색 영역 안 둥근 프로필 입니다. 여기서 프로필의 크기는 25*25, 35*35 등 서로 다르지만, 공통적으로 프로필은 왼쪽에 위치하고 사용자가 프로필을 누를 경우 특정 사용자의 프로필 화면으로 이동해야 합니다.

 

 

파란색 영역은 같지만 노란색 영역은 어떻게 구현하는가에 따라 서로 다른 이벤트를 발생시킵니다.

사용자의 스토리 포스트 관련 설정 옵션 버튼, 좋아요, 댓글 입력, 댓글 보내기 등 노란 색 영역이 어떻게 정의되는지에 따라 다양한 이벤트가 발생될 수 있습니다. 그럼에도 이들의 공통적인 특징은 빨간색 영역 안에서 프로필 영역인 파랑색 영역의 레이아웃이 같고, 프로필클릭할 때 특정 사용자의 프로필 화면으로 이동해야 하는 것입니다. 

 


그래서 빨간색 영역의 뷰를 BaseProfileAreaView로 선언했습니다.

 

 

위에 선언한 델리게이트 처럼, 이 뷰의 역할이 있습니다. 프로필 이미지뷰의 터치가 있을 경우 프로필 이미지에 대한 정보를 호출해서 해당 사용자의 정보를 기반으로 프로필 화면으로 이동해야 합니다.

 

 

또한 빨간색 뷰 안에 프로필의 레이아웃과 노란 영역을 프로퍼티로 하는 뷰의 레이아웃도 지정해야합니다. 

 

 

이렇게 BaseProfileAreaView를 구현했습니다.

 

그리고 여기서 문제는 아니지만, 위임하는 것을 깜빡 할 문제가 발생할 수 있습니다. BaseProfileAreaView를 상속하는 다양한 sub view에서 발생되는 추가적인 델리게이트 프로토콜이 각각 생기는 것입니다. 이는 BaseProfileAreaView를 상속받는 하위 뷰에 따라 추가적인 델리게이트 프로토콜이 다양하다는 것입니다. 예를들어 위에서 언급했던 옵션버튼, 좋아요, 하트 버튼 등 ...


그러나 BaseProfileAreaView에서는 delegate 변수를 weak var로 선언했기에, 자식 뷰에서 또 다른 델리게이트 타입의 프로토콜을 base 뷰에서 선언한 delegate 프로퍼티와 다른 델리게이트 프로퍼티 네이밍으로 해야합니다. 이럴 경우 델리게이트를 실행하는 쪽에서 두 가지 delegate protocol 전부 위임을 해야하는데 누락할 수 있는 경우가 있을 것입니다. 그래서 저는 자식 뷰의 자식 델리게이트에서 base view에 선언된 델리게이트도 위임할 수 있도록 처리하고 싶었습니다.

 


BaseProfileAreaView를 상속받는 예로 위 사진의 왼쪽. 포스트의 헤더를 담당하는 PostHeaderView가 있습니다.

 

PostHeaderView는 기본적으로 BaseProfileAreaView를 상속받습니다. 기본적으로 프로필을 누를 때 발생하는 base view에서 선언한 델리게이트 프로퍼티 있습니다. 추가적으로 노란 영역의 우측에 있는 옵션 버튼을 눌렀을 경우에 포스트를 신고하거나 설정하는 바텀시트가 올라와야 합니다. 또 새로운 델리게이트 프로토콜을 선언 후 프로퍼티로 선언해야합니다.

 

그리고 위 사진처럼 sub view의 delegate를 선언할 경우 이름이 중첩됩니다. 그래서 subDelegate라는 다른 네이밍의 프로퍼티를 선언할 경우 PostHeaderView를 사용하는 곳에서는 PostHeaderViewDelegate, BaseProfileAreaViewDelegate 두 가지 타입의 프로퍼티들의 위임을 모두 해주어야하고 위임할 때 둘 다 전부 처리하지 못할 경우가 있을 것입니다.

 

PostHeaderView에서 delegate 프로퍼티 하나로 BaseProfileAreaViewDelegate, PostHeaderViewDelegate 둘 다 처리하기 위해서 프로토콜 상속과 BaseProfileAreaView의 델리게이트 네이밍을 수정했습니다.

 

기존 Base클래스의 델리게이트 네이밍을 baseDelegate로 지정했습니다.

 

 

Sub class의 delegate protocol은 BaseProfileAreaViewDelegate를 상속받습니다. 그리고 sub class의 delegate protocol을 프로퍼티로 선언 후 Base 클래스에 선언한 baseDelegate를 computed property와 케스팅으로 구현하게 된다면 PostHeaderView는 deleagte 위임 처리 하나만 해도 BaseProfileAreaViewDelegate, PostHeaderViewDelegate 둘 다 처리할 수 있게 됩니다. (물론 이를 수행하는 클래스에서 PostHeaderViewDelegate를 준수해야만 PostHeaderViewDelegate의 메서드도 수행할 수 있게 됩니다.

 

이로써 base class에서 선언한 델리게이트 프로토콜을 sub class에서 사용하고 확장할 수 있게 되었습니다 +_+