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.mainBundle.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)