요약
- 기존에는 UIKit과 AppKit의 프레임워크별 entry point 진입을 위한 attribute가 달랐다.(@UIApplicationMain, @NSApplicationMain)
- 개발자가 크게 신경쓰지 않는 UIApplicationMain과 NSApplicationMain을 범용적이고 간단하게 작성하기 위해 swift 5.2부터 @main attribute로 통합하였다.
- 즉, @main은 top-level code인 @UIApplicationMain이나 @NSApplicationMain attribute를 호출해 UIKitd이나 AppKit 내에 있는 main()를 호출하기 위한 attribute이다.
@main을 정리한 이유
- Swift에서도 디바이스가 앱의 시작 지점을 알기 위해 main함수로 시작되어야 한다.
- 근데 Swift에서는 main()함수가 없고, @main이라는 attribute만 존재한다.
- 그렇다면 @main이 main()의 역할을 대행하는 것으로 보이는데, 자세한 내용이 궁금했다.
Top-level code
- Swift 소스파일의 top-level code는 0개 이상의 statements, declarations, expression으로 구성 되어있다.
- 기본적으로 소스파일의 top-level에서 선언된 변수, 상수, 명명된 선언들은 같은 모듈의 일부인 모든 소스 파일 내에서 접근할 수 있다.
- 선언에 access-level modifier를 표시해 기본 동작을 Override할 수 있다.
- top-level code의 2가지 종류로, top-level declarations와 실행 가능한 top-level code가 있다.
- top-level declarations: 오직 declaration로만 구성되어 있고, 모든 Swift source file에서 허용된다.
- 실행가능한 top-level code: statements, expresssion, declarations를 포함하고, 오직 프로그램의 top-level entry point로서만 허용된다.
- 실행 파일을 만들기 위해 compile하는 Swift 코드는, 코드가 파일과 모듈 안에서 어떻게 구성되었는지와 상관없이 top-level entry point을 표시하는 다음 방법 중 하나만을 포함한다.
- NSApplicationMain attribute
- UIApplicationMain attribute
- main.swift
- top-level code가 없어도 항상 entry point로 간주된다.
- @main과 함께 사용해선 안 된다.
- top-level excutable code를 포함하는 파일
@UIApplicationMain, @NSApplicationMain, @main의 탄생 이유