3주차 과제 계산기 만들기 LV.1을 해결하며 (부제: init(frame: CGRect ) 과 required init?(coder: NSCoder) )

이진욱(JIN WOOK)·2024년 11월 11일
0

과제에관하여

목록 보기
3/6


3주차에 접어들었습니다.
이제 본격적인 앱개발 교육이 시작됩니다.

역시 딱 한번만 만들어봐서 그런가 이전에 들었던 강의에 포함되어 있던 예제코드를 보면서 제작했습니다.

이번 목표는 코드로 작성해보기!
처음부터 폴더를 나눠서 코드를 작성하기로 했습니다.
(Models,Views,Controllers) 이렇게요!

LV.1과제의 경우 단순히 보여지는 것 view라고 생각해서 Views라는 폴더에 담았습니다.


내부에 Cocoa Touch Class의 UIview를 상속한
CalculatorView 클래스가 담겨있습니다. -> 이것도 추후에 공부해야 될꺼 같아요

이렇게 UIView를 상속한 클래스를 생성하려면 UiView에서 내려오는 생성자를 구현해줘야 합니다.
특히 상속의 경우는 필수 생성자로 init?(coder: NSCoder)을 꼭 구현해줘야 합니다.

이렇게 인스턴스를 생성하려고 하면
coder: 와 frame: 이라는 두가지 생성자가 존재합니다.

근데 이 생성자들의 정체는 뭘까요?
저도 뭐 따라친다고 작성하긴 했는데 무슨 차이가 있는지 잘 모르겠습니다.. 그래서 한번 공식문서를 봤습니다.


init(frame: CGRect )

원래 코드로 작성시 뷰를 생성할때는 이렇게 초기값을 생성해줘야 한다고 합니다.

let view = UiView() 의 경우는 단순히 객체만 올려놓는것이고 
위치 설정을 나중에 하겠다는 의미라네요.

view의 위치설정을 해주고(프레임의설정) 위치설정 값을 전달해줍니다.
위치 값은 CGRect 라는 타입으로 선언 해야 하네요.

아 그러면 제가 짠 코드가 약간은 이해가 갑니다.

setup()함수에는 CalculatorView의 배경을 까맣게 만들어 주는 설정이 있습니다.
그리고 레이블의 제약 설정이 있습니다.

저는 UIView()를 상속한 커스텀 뷰를 생성했으니 부모클래스의 생성자를 받아와야겠죠.
이 생성자에서는 super.init(frame:)을 호출해서 UIView의 기본 초기화 과정을 먼저 실행합니다.
그리고 제가 설정한 커스텀 값을 실행합니다.


required init?(coder: NSCoder)

UIview를 상속하면 (= 커스텀 뷰로 사용하면)
반드시 이 필수 생성자를 구현 해줘야 합니다.

  required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

필수 생성자기에 Xcode에서 자동으로 입력해줍니다.

이 생성자는 주로 스토리보드로 UI를 짤때 구현해서 사용한다고 합니다.

스토리보드로 짜는 UI도 결국은 내부가 코드로 되어있기 때문에
iOS가 이 파일의 정보를 디코딩해서 UIView인스턴스를 생성합니다.

서로 혼합해서 사용하는 경우가 있기때문에 반드시 구현해야하는 생성자 라고 합니다.

만약 그 디자인 파일이 잘못되면 에러메세지를 출력해 내나봐요..

하.. 잘못건들였네요... 이해하고 싶은데 공식문서로만 공부하기에는 모르는게 너무 많아서 힘들었습니다ㅠㅠ

profile
기술로부터 소외 되는 사람이 없도록 우리 모두를 위한 서비스를 만들고 싶습니다.

0개의 댓글

관련 채용 정보