Section 7/171 menit
7. Resources, Localization, dan Bundle
7. Resources, Localization, dan Bundle
Resource di SPM
Sejak Swift 5.3, SPM mendukung resource. Cara declare:
swift
.target(
name: "MyLib",
resources: [
.process("Resources"), // process: optimasi sesuai tipe
.copy("RawAssets"), // copy: as-is, tanpa transformasi
.process("Sounds/notification.wav"),
]
)
| Rule | Kapan dipakai |
|---|---|
.process |
Asset catalog, storyboard, xib, plist, json, image. SPM optimize sesuai tipe (compile xcassets, kompres image, dll). |
.copy |
Resource yang harus persis seperti aslinya. ML model, font, raw data. |
Mengakses Resource
SPM auto-generate Bundle.module di setiap target yang punya resource:
swift
// Akses image dari resource bundle target
let image = UIImage(named: "logo", in: .module, compatibleWith: nil)
// Load JSON
let url = Bundle.module.url(forResource: "config", withExtension: "json")!
let data = try Data(contentsOf: url)
// Load font
let fontURL = Bundle.module.url(forResource: "Inter-Regular", withExtension: "ttf")!
Gotcha umum: Bundle.main ≠ Bundle.module. Bundle.main adalah app bundle (host). Resource di SPM package selalu di Bundle.module.
Localization
swift
.target(
name: "MyLib",
resources: [.process("Resources")],
swiftSettings: []
)
// Plus: declare default localization di Package
swift
let package = Package(
name: "MyLib",
defaultLocalization: "en",
// ...
)
Layout:
swift
Sources/MyLib/Resources/
├── en.lproj/Localizable.strings
├── id.lproj/Localizable.strings
└── ja.lproj/Localizable.strings
Akses:
swift
let title = String(localized: "welcome.title", bundle: .module)