Bundle 클래스란 디스크의 bundle 디렉토리에 저장된 코드와 리소스의 표현입니다.
여기서 그럼 Bundle이란 실행 가능한 코드와 그 코드가 사용하는 자원을 포함하고 있는 디렉터리입니다.
Apple은 bundle을 사용하여 앱, 프레임워크, plug_in 및 기타 많은 특정 유형의 콘텐츠를 나타냅니다. bundle은 포함된 리소스를 잘 정의된 하위 디렉토리로 구성하며, bundle 구조는 플랫폼과 번들 유형에 따라 다릅니다. 번들 객체를 사용하면 번들의 구조를 모른 채 번들의 리소스에 액세스할 수 있습니다. bundle 객체는 bundle 구조, 사용자 선호도, 사용자의 지역 및 기타 관련 요소를 고려하여 아이템을 찾기 위한 단일 인터페이스를 제공합니다.
모든 실행 파일은 bundle 객체를 사용하여 앱의 번들 내부 또는 다른 곳에 있는 알려진 bundle에서 리소스를 찾을 수 있습니다. 컨테이너 디렉토리나 파일 시스템의 다른 부분에서 파일을 찾기 위해 bundle 객체를 사용하지 않습니다.
bundle을 사용하는 주된 패턴은 다음과 같습니다.
- 의도된 bundle 디렉터리에 대한 bundle 객체를 만들어야합니다.
- bundle 객체의 메서드를 사용하여 필요한 리소스를 찾거나 불러옵니다.
- 다른 시스템 API를 사용하여 자원과 상호작용합니다.
자주 사용되는 일부 유형의 자원은 bundle 없이 찾아서 열 수 있습니다. 예를 들어, 이미지를 로드할 때, 자산을 catalog에 저장하고 UIImage 또는 NSImage의 init(named:) 방법을 사용하여 로드합니다. 마찬가지로, 문자열 리소스의 경우, 전체 .strings 파일을 직접 로드하는 대신 NSLocalizedString을 사용하여 개별 문자열을 로드합니다.
Finding and Opening a Bundle
리소스를 찾기 전에 반드시 어느 bundle에 위치해 있는지 명시해야합니다. Bundle 클래스는 많은 구조체로 이루워져있지만 주로 사용하는 곳은 main 입니다. main bundle 은 현재 실행 중인 코드가 포함된 bundle 디렉토리를 나타냅니다. 따라서 앱의 경우, 주요 bundle 객체는 앱과 함께 제공된 리소스에 대한 액세스를 제공합니다.
앱이 plug-ins, 프레임워크 또는 기타 bundle content와 직접 상호 작용하는 경우, 이 클래스의 다른 방법을 사용하여 적절한 bundle 객체를 만들 수 있습니다. 알려진 URL이나 path에서 항상 bundle 객체를 만들 수 있지만, 다른 방법을 사용하면 앱이 이미 사용하고 있는 bundle에 더 쉽게 접근할 수 있습니다. 예를 들어, 프레임워크에 연결하면, init(for:) 메소드를 사용하여 해당 프레임워크에 정의된 클래스를 기반으로 프레임워크 번들을 찾을 수 있습니다.
// Get the app's main bundle
let mainBundle = Bundle.main
// Get the bundle containing the specified private class.
let myBundle = Bundle(for: NSClassFromString("MyPrivateClass")!)
Locating Resources in a Bundle
Bundle 객체를 사용하여 bundle 내부의 특정 자원의 위치를 얻을 수 있습니다. 자원을 찾을 때, 최소한 자원의 이름과 유형을 제공합니다. 특정 하위 디렉토리의 리소스의 경우, 해당 디렉토리를 지정할 수도 있습니다. 리소스를 찾은 후, bundle routines은 파일을 여는 데 사용할 수 있는 경로 문자열이나 URL을 반환합니다.
NSBundle *main = [NSBundle mainBundle];
NSString *resourcePath = [main pathForResource:@"Seagull" ofType:@"jpg"];
번들(Bundle) 객체는 디스크에서 리소스를 찾을 때 특정한 검색 패턴을 따릅니다. 전역 리소스, 즉 언어별 `.lproj` 디렉토리에 속하지 않은 리소스가 먼저 반환되고, 이후에 지역 및 언어별 리소스가 반환됩니다. 이 검색 패턴은 번들이 리소스를 다음과 같은 순서로 찾도록 합니다
1. 전역 리소스들
2. 유저가 설정한 지역의 localized 리소스들
3. 유저가 설정한 언어별 리소스들
4. 개발 언어 리소스 (번들의 Info.plist 파일의 CFBundleDevelopmentRegion 키에 의해 지정됨)
전역 리소스가 언어별 리소스보다 우선순위가 높기 때문에 앱에는 특정 리소스의 전역 버전과 localized된 버전을 함께 포함해서는 안 됩니다. 전역 버전의 리소스가 존재할 때는 언어별 버전이 반환되지 않습니다. 이런 우선순위를 가지는 이유는 성능 때문입니다. 만약 localized 된 리소스가 먼저 검색되었다면 번들 객체는 리소스를 반환하기 전에 존재하지 않는 localized 된 리소스를 찾는 데 시간을 낭비할 수 있습니다.
'SwiftUI' 카테고리의 다른 글
NSCoding (0) | 2023.11.13 |
---|---|
Archiving, encoding, decoding (0) | 2023.11.13 |
FileDocument (0) | 2023.11.12 |
Files and Directories - 파일 디렉터리 접근 (0) | 2023.11.11 |
Button (0) | 2023.11.11 |