App store 및 운영 체제는 사용자의 기기 및 운영체제 버전에 맞게 app delivery를 조정하여 최소한의 설치공간을 사용할 수 있도록 iOS, tvOS, watchOS앱들의 설치를 최적화한다.
App thinning이라고 불리는 최적화를 통해 device의 기능 대부분을 사용하고 최소 디스크 공간을 차지하며 향후 Apple에 의한 업데이트들을 수용하는 앱을 생성할 수 있다.
더 빠른 다운로드와 다른 앱과 콘텐츠를 위한 더 많은 공간은 더 나은 사용자 경험을 제공한다.
App thinning에는 슬라이싱(slicing), 비트코드(bitcode), 주문형 리소스(on-demand resource)가 있다.
: 다양한 기기와 운영체제 버전에 대하여 여러가지 app bundel의 변형(variants)을 생성하고 전달하는 과정
변형(variants)은 실행 가능한 아키텍쳐, 리소스만 포함한다.
앱의 전체 버전을 계속 개발하고 앱스토어 커넥트에 업로드한다. 앱스토어는 앱이 지원하는 기기 및 운영 체제 버전에 따라 다양한 변형(variants)을 생성하고 제공한다.
앱스토어에서 각 변형에 적합한 이미지, GPU리소스 및 기타 데이터를 선택할 수 있도록 자산 카탈로그를 사용한다.
사용자가 앱을 설치하게되면 사용자의 기기 및 기기의 운영 체제 버전에 맞춰 변형(variants)이 다운로드가 된다.
Xcode는 개발 중에 슬라이싱(slicing)을 시뮬레이션하므로 로컬에서 앱의 변형(variants)을 만들고 테스트 할 수 있다. 기기나 시뮬레이터에서 앱을 빌드하고 실행할 때 Xcode는 앱을 슬라이싱(slicing)한다.
아카이브를 생성할 때, Xcode에는 앱의 전체 버전을 포함하지만 아카이브에서 변형(variants)을 내보낼 수 있다.
참고
슬라이스 앱은 iOS및 tvOS 9.0 이상을 실행하는 장치에서 지원된다. 그렇지 않으면 앱스토어는 고객에게 범용 변형을 제공한다. 범용 변형은 MDM(모바일 기기 관리), Apple School Manager 또는 Apple Business Manager를 통해 대량으로 구매합 앱 또는 iTunes 12.6 또는 이전 버전을 사용하여 다운로드한 앱을 통해서도 제공된다.
: 컴파일된 프로그램의 중간 표현
비트코드가 포함된 앱스토어 컨넥트에 업로드하는 앱은 앱스토어에서 컴파일 및 연결된다. 비트코드를 포함하면 애플은 앱의 새 버전을 앱스토어에 제출할 필요 없이 향후 앱 바이너리를 다시 최적화할 수 있다.
앱 바이너리는 컴퓨터가 실행할 기계어 코드를 포함하는 파일
iOS 앱의 경우 비트코드가 기본값이지만 선택 사항이다. watchOS 및 tvOS 앱의 경우 비트코드가 필요하다. 비트코드를 제고앟는 경우 앱 번들의 모든 앱과 프레임워크(프로젝트의 모든 대상)는 비트코드를 포함해야 한다.
Xcode는 기본적으로 앱의 기호를 숨겨서 읽을 수 없서 애플에다. 앱을 앱스토어 컨넥트에 업로드할 때 기호를 포함할 수 있는 옵션이 있다. 기호를 포함하면 TestFlight를 사용하여 앱을 배포하거나 앱스토어를 통해 앱을 배포할 때 애플에서 앱에 대한 충돌 보고서를 제공할 수 있다. 기호화 충돌 보고서를 직접 수집하고 싶다면 기호를 업로드할 필요가 없다. 대신 앱을 배포한 후 비트코드 컴파일 dSYM파일을 다운로드 할 수 있다.
: 키워드로 태그를 지정하고 태그별로 그룹으로 요청할 수 있는 이미지 및 사운드와 같은 리소스이다. 앱스토어는 애플 서버의 리소스를 호스팅하고 다운로드를 관리한다. 또한 앱스토어는 주문형 리소스를 분할하여 앱 변형을 더욱 최적화한다.
쉽게 말해서 필요할 때 다운로드를 받는 것.
주문형 리소스는 더 나은 사용자 경험을 제공한다.
참고
앱을 등록된 장치(앱스토어 외부)에 배포하는 경우 주문형 리소스를 직접 호스팅해야 한다.
: 보조 이니셜라이저, 말 그대로 보조이기 때문에 기본 이니셜라이저가 있어야만 사용 가능하다.
프로퍼티 중 일부만 초기화할 경우 혹은 프로퍼티의 일부는 기본 값을 지정하고 싶을 경우에 사용할 수 있다.
1단계 - 등산 (모든 멤버 초기화)
2단계 - 하강 (상속받은 멤버들에 대한 customizing)
required 키워드가 init앞에 붙으면, 모든 sub class들이 명시적으로 해당 초기화를 구현
(required를 붙이면 상속의 의미가 이미 있으므로, override키워드는 붙이지 않음)
Designated init과 Convenience init의 차이
initializer
Swift는 특정하지 않은 타입에 대해 동작하도록 특별한 타입 Any, AnyObject를 제공한다.
사용하려면 AnyObjcet로 타입 캐스팅을 해주어야한다.
장점
상속관계가 아니어도 타입 캐스팅이 가능하다.
Any, AnyObject의 타입 캐스팅 ( 단점 )
이 두 가지는 매 번 타입 체크 및 형변환을 해야하기 때문에 필요에 의한 것이 아니라면 사용하지 않는 것이 좋다.
그럼에도 불구하고 사용한다면 switch문을 활용하여 각 타입마다 as?, as!를 통해 다운 캐스팅이 성공하는 case문을 만들어준다.