Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Custom View와 protocol (커스텀 뷰 구현 시 프로토콜 사용하기, DIP) 본문

iOS 응용 (swift)

[iOS - swift] Custom View와 protocol (커스텀 뷰 구현 시 프로토콜 사용하기, DIP)

jake-kim 2024. 1. 1. 23:01

Custom View 구현 시 프로토콜을 사용하면 좋은 이유

  • 보통 커스텀 뷰를 구현하면 사용하는쪽에서 가져다 쓰는데, 사용하는곳이 여러곳이면 이 커스텀 뷰를 수정할때 여러곳을 고려해야하여 수정이 어려움이 존재
  • 프로토콜을 사용한다면?
    • 구현체의 의존성을 사용하는쪽에 두지 않는것이 가장 큰 의미, DIP(Dependency Inversion Principle)
    • 사용하는쪽에서는 Interface에만 의존하고 있기 때문에 구현체에 여러가지 변화를 주더라도 유연한 구조 유지가 가능
    • ex) 커스텀 뷰가 공통 뷰이고 이 뷰가 Swift에서 SwiftUI로 넘어갈 때 역시도 protocol로만 외부에게 노출했으면 유연하게 수정이 가능

protocol로 커스텀 뷰 구현하기

  • 커스텀 버튼을 만든다고 했을 때, UIView로 추상화하고 Titleditlable만 따르도록 구현
class MyButton: UIView, TitleEditable {
    private let button = UIButton()
    
    func changeText(_ text: String) {
        button.setTitle(text, for: .normal)
    }
}

protocol TitleEditable {
    func changeText(_ text: String)
}
  • 사용하는쪽에서는 TitleEditlable에 의존하고 있는 상태이므로, MyButton이 SwiftUI로 변경되도, 다른 뷰로 교체해도 사용하는쪽에서는 changeText만 바라보고 있으므로 유연하게 수정이 가능
class ViewController: UIViewController {
    let myButton = MyButton()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(myButton)
        
        myButton.changeText("A")
    }
}

정리

  • protocol로 인터페이스를 제공하는 방향으로 커스텀 뷰를 만들다 보면, 커스텀 뷰 구현체의 변경이 더욱 쉽게 가능
  • protocol로 인터페이스를 기능별로 쪼개다보면 protocol자체도 여러곳에서 재활용이 가능
    • ex) TitleEditable이라는 프로토콜은 버튼의 타이틀 변경에도 필요하지만 텍스트 필드와 같은 곳에서도 커스텀을 만든다면 사용이 가능
Comments