Swift 기본 정리 - 생성자/Responder Chain/App 실행/Optional

기술면접 대비 Swift 정리편
오니's avatar
Jun 30, 2024
Swift 기본 정리 - 생성자/Responder Chain/App 실행/Optional

편의 생성자

  • 편의 생성자는 반드시 지정 생성자를 호출해야함.
  • 편의 생성자는 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 업데이트 호출을 기대하는 함수이다.

layoutIfNeeded

Main Runloop에 즉시반영 될 것을 기대한다

setNeedsLayout

RunLoop의 다음 시기에 업데이트를 기대한다.

왜 layoutSubview를 호출하면 안되는 것일까?

  • UI업데이트는 main runloop가 돌면서 수행해야 하기 때문이다.

왜 UI업데이트는 main Thread에서 수행되야 하는가?

  1. 호출 시기가 제멋대로면 layout이 깨질 위험이 있다.
  1. 과도한 GPU 요청을 방지 (main thread에서 serial로 순차적 요청)
  1. Responder Chain이 main Thread에서 이뤄지기 때문이다.

App 실행 과정

  1. main함수 실행
  1. UIApplicationMain() 함수 실행
  1. UIApplication 객체 생성
      • responder Chain 형성
      • app Delegate 위임
  1. Info.plist / Storyboard 생성
  1. willFinishLaunchingWithOptions
  1. main Thread RunLoop 생성
  1. didFinishLaunchingWithOptions
  1. 앱 실행에 따른 함수 실행
    1. notion image
       

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

오니의 개발 블로그