
편의 생성자
- 편의 생성자는 반드시 지정 생성자를 호출해야함.
- 편의 생성자는 extension을 통해서도 구현 가능하다.
clipToBounds vs MaskToBounds
둘 다 부모 View를 벗어나도 그릴지 결정하는 변수
ClipToBounds → View
MaskToBounds → CALayer
Responder Chain
처리 되지 않은 이벤트를 처리 가능한 Responder로 전달하는 과정
addTarget(self, action: #selector, for: )
위 함수에서
self
가 Responder Chain을 의미한다.→ nil로 넣으면 Framework가 정한 responder Chain을 따라가겠다는 의미
Closure Capture
- 클로져 캡쳐는 기본으로 Referece Type
{ [val1, val2] _ in
}
- Capture List를 통해서 Value Type으로 캡쳐한다.
- 단, Reference는 여전히 Referece로 사용된다.
layoutIfNeeded vs setNeedsLayout
둘 다 layoutSubview, 즉 view 업데이트 호출을 기대하는 함수이다.
왜 layoutSubview를 호출하면 안되는 것일까?
- UI업데이트는 main runloop가 돌면서 수행해야 하기 때문이다.
왜 UI업데이트는 main Thread에서 수행되야 하는가?
- 호출 시기가 제멋대로면 layout이 깨질 위험이 있다.
- 과도한 GPU 요청을 방지 (main thread에서 serial로 순차적 요청)
- Responder Chain이 main Thread에서 이뤄지기 때문이다.
App 실행 과정
- main함수 실행
- UIApplicationMain() 함수 실행
- UIApplication 객체 생성
- responder Chain 형성
- app Delegate 위임
- Info.plist / Storyboard 생성
- willFinishLaunchingWithOptions
- main Thread RunLoop 생성
- didFinishLaunchingWithOptions
- 앱 실행에 따른 함수 실행

Optional
Optional은 enum 형태로 구성되어 있다.
enum Optional<Wrapped> {
case none
case sone(Any)
}
Optional Chain
let a: String? = "abcde"
a?.reversed().forEach { ... }
Optional Binding
if let a { }
guard let a else { return }
옵셔널 암시적 추출
- 옵셔널 타입인데, Framework에서 사용시에 자동으로 옵셔널을 해제하여 사용하는 의미
@IBOutlet button: UIButton!
- init과 분리하고 싶을 때 사용한다.
Share article