# 활동학습 준비 ### View Controller의 View의 상태변화에 따른 메서드의 호출순서를 이야기해보세요 * 직접 호출되는 것이 아닌, view의 상태가 변할 때마다 약속된 메소드가 호출되는 것! * 왜 super.*** 를 해줄까? : View Controller는 UIViewController를 상속하는 class인데, UIViewController가 기밀이라 발생 할 수 있는 충돌을 예방하기 위해서. --- 0.loadView : view 프로퍼티의 값이 nil일 때 호출되어 View Controller가 관리하는 view를 만드는 역할을 한다 해당 메소드 안에선? : 이 메소드 안에서 새로운 뷰를 만들어서 뷰 컨트롤러의 메인 뷰로 설정해줘도 된다. 뷰 컨트롤러의 기본 뷰를 커스텀 뷰로 사용하고자 할 때 유용. 스토리보드를 쓰면 어차피 스토리보드에 있는 뷰를 가져와 쓸 테니 굳이 필요하지 않다. --- 1.viewDidLoad : view의 초기화가 이루어진다. viewDidLoad() 는 뷰가 모두 생성되고 메모리에 처음 stack으로 로드될 때 호출된다. 화면에 보여지지 않는 순간에 내부에 적힌 코드가 실행될 수 있다. 해당 메소드 안에선? : 초기값을 설정하거나 옵져버를 등록하는 등 뷰의 초기화 작업을 진행한다. --- 2.viewWillAppear : view가 view 계층에 추가, 즉 화면에 표시되기 직전에 수행된다. 화면이 보일 때 마다 내부 코드가 수행된다. 해당 메소드 안에선? : 뷰에 보여질 데이터를 불러온다. (데이터가 갱신이 되는 경우) --- 3.viewDidAppear : view가 화면에 표시된 이후 수행된다. 해당 메소드 안에선? : view 나타날 때 수행할 추가작업을 진행한다. 보통 다른 view에 있다가 돌아오는 경우 실행 되어야하는 작업들이다. ex:) 사용자 환영 애니메이션, 배경음악 재생 --- 4.viewWillDisappear : view가 사라지기 직전에 호출된다 해당 메소드 안에선? : 배경음악 중지 작업 같이 화면이 사라지려고 하는 순간 진행되어야하는 작업을 내부에 적는다 --- 5.viewDidDisappear : view가 제거되었음을 알린다. 해당 메소드 안에선? : 옵져버 구독 중단 등 view가 제거되고 나서 진행되어야하는 작업을 내부에 적는다. --- ### viewWillAppear와 viewDidAppear에서 무엇을 하면 좋을까요? viewWillAppear - view 계층에 추가되기 직전에 호출된다 - 화면에 보이기 전에 호출된다 - view의 bounds가 정의되지만 위치는 정의되지 않은 상태이다 viewWillLayoutSubviews - bounds가 최종적으로 결정된다. - view controller의 view의 subview들이 로드될때마다 호출된다 layoutSubviews - subview를 배치한다 - 직접 호출되지 않는다 viewDidLayoutSubviews - view controller에게 subview들이 설정되었음을 알린다. - 마찬가지로 view controller의 view의 subview들이 로드될때마다 호출된다 - layoutSubviews 의 실행이 완료되면 콜백으로 호출된다. viewDidAppear - view 계층에 추가되고, 화면에 보이고 난 후 호출된다 - UIView의 layoutSubviews 메서드가 호출되고나서 불린다 #### UIView의 layoutSubviews 메서드는 viewWillAppear보다 먼저 호출되나요? 그렇게 생각한 이유는 무엇인가요? 아니요. viewWillAppear 이후에 호출됩니다. layoutSubviews 메서드가 호출되기 전에 우선 뷰가 생성되고 메모리에 로드 되어야한다고 생각합니다. 그 후 viewWillAppear와 viewDidAppear 사이에서 view가 계층에 추가되고 subview들이 설정이 되어야 viewDidAppear에서 view가 보여질 수 있지 않을까 생각합니다. ### 스위프트 언어의 String에서 subscript를 통해 문자에 접근할 수 없는 이유에 대해 설명해주세요. Sting은 [int]로 접근하지 못하고 String.index로 접근해야한다. 이유: Character가 1개 이상의 unicode scalar로 이루어져있어 크기가 가변적이다. String: Character의 Collection(Array) Character가 1개 이상의 unicode scalar로 이루어져있어 크기가 가변적이다. -> 무엇을 기준으로 인덱싱을 지원해야하는 지가 애매하다. -> 같은 타입의 자료로 이루어진 배열이라고 받아들이기 어렵다. #### 스위프트 언어는 왜 Character가 unicode scalar로 이뤄지도록 하였나요? -> 유니코드 문자들이 깨지지 않은 상태로 보여줌 -> character 단위 문자열 처리에 비용이 많이 든다