안녕하세요 별 내용은 아니고 공부하다가 생각나서 빠르고 짧게 글을 써봅니다.
예전에는 상속을 도대체 언제 쓰는거지? 할정도로 상속에 대한 이해도 부족하고
개념으로만 알고 있다가 최근에서야 활용하게 되었는데요.
이런 식으로 BaseViewController를 선언해두고
뷰 컨트롤러를 만들때마다 상속해서 쓰니까 코드도 짧아지고 생산성이 올라가더라구요.
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setMain()
setInterface()
setDelegate()
setAddTarget()
setAddView()
setAutoLayout()
}
func setMain() {}
func setInterface() {}
func setAddView() {}
func setAutoLayout() {}
func setAddTarget() {}
func setDelegate() {}
}
저 방식이 편해서 커스텀 뷰도 저렇게 BaseView를 만들어서 상속해서 사용했습니다.
class BaseView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setInterface()
setAddView()
setAutoLayout()
setDelegate()
setAddTarget()
setMain()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setMain() {}
func setInterface() {}
func setAddView() {}
func setAutoLayout() {}
func setDelegate() {}
func setAddTarget() {}
}
얼마 안가서 눈치챈건데 이렇게 커스텀 뷰도 상속해서 쓰니까
상속받은 함수들을 다시 private으로 할 수 없게 됩니다.
상속받은 함수들을 오버라이딩해서 private으로 바꾸려고 한다면
이런 컴파일러에서 이런 메세지를 띄워줍니다.
이게 당연한것이
Swift에서는 상속 관계에서 메서드의 접근 수준을 더 높은 수준으로 변경할 수 있지만 축소할 수는 없습니다.
이렇게 접근 수준을 다시 설정할 수 없게 된다면
앞에 접근 수준을 따로 명시하지 않았으니 Internal 수준의 접근 수준으로 설정되어
아래의 사진처럼 인스턴스를 생성했을 때 상속받은 함수들에 전부 접근이 가능합니다.
일단 저 사진의 nameView에서는
오버라이딩은 안되는 것 같은데....
그렇다면 커스텀 뷰를 만들때는 저렇게 상속을 사용하지 말아야 하는지
일반적으로 어떻게 하는지 궁금합니다...
지금 시간이 늦어서 어디 물어볼수는 없고
나중에 알게 된다면 글을 수정하도록 하겠습니다!
물론 이런 문제에 정답은 없지만 주위에서는 물어보니
커스텀 뷰까지 저렇게 BaseView를 받지는 않는것 같습니다.
저도 접근수준을 private으로 하고싶기 때문에 수정할듯 합니다.