Hola, me llamo Miguel y aquí les traigo un post.
Índice
Swift 5.3
aporta capacidades de recursos a SPM
SE-0271
por Anders Bertelrud y Ankit Aggarwal aporta recursos a Swift Package Manager
. Si tiene alguna experiencia en el desarrollo de iOS, sabrá que puede agregar archivos no compilados con Bundle
.
Swift Package Manager
, basado en Swift 5.3
o posterior, puede agregar lo mismo. Puede agregar imágenes, sonido y JSON y Swift generará el paquete por usted.En el momento de redactar este artículo, Swift 5.3
no se lanzó oficialmente, pero si desea probarlo, descargue una compilación de instantáneas en Swift Snapshot.
En cada objetivo, sepa que puede declarar recursivamente o específicamente qué recursos desea agregar; más detalles sobre esto más adelante.
.target(name: "HelloWorldProgram", dependencies: [], resources: nil)
Si agrega un archivo no compilado a su directorio de destino, Swift le dará esta advertencia:
error: found 2 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/wendyliga/resource-spm/Sources/resource-spm/README.md /Users/wendyliga/resource-spm/Sources/resource-spm/Images/image.png
Para resolver esto, Swift 5.3
introduce parámetros de recursos en .target
. Hay dos recursos que puede definir.
Copiar
Copy
le pedirá a Swift que aplique la regla de copia a cada recurso que declare. Si apunta al directorio con copy
, Swift conservará su estructura. Por lo tanto, solo desea usarlo copy
si desea conservar su estructura de directorio. Si no es así, utilice process
en su lugar.
.copy(path:)
Ejemplo:
.target( name: "HelloWorldProgram", dependencies: [], resources: [.copy("README.md"), .copy("image.png")] )
Ejemplo en directorio:
.target( name: "HelloWorldProgram", dependencies: [], resources: [.copy(Images), .copy("README.md")] )
Si verifica el paquete compilado (depende de su configuración, pero el valor predeterminado será project-path/.build/build/your-project-name.bundle
), puede ver que Swift copiará y conservará su estructura.
Proceso
Process
hará casi lo mismo con copy(path:)
, pero en cambio, simplemente copiando el archivo, process
seguirá las reglas de copia y optimización basadas en la plataforma en la que se ejecuta.
Si está apuntando a un directorio, agregará recursivamente los archivos dentro, pero no conservará la estructura del directorio.
.process(path:)
Ejemplo:
.target( name: "HelloWorldProgram", dependencies: [], resources: [.process("README.md"), .process("image.png")] )
Ejemplo en directorio:
.target( name: "HelloWorldProgram", dependencies: [], resources: [.copy(Images), .copy("README.md")] )
Por defecto, debes usar process
. process
se prefiere porque Swift agregará reglas de eficiencia de la plataforma según el tipo de archivo. Pero, ¿qué sucede si desea agregar recursos localizados donde la Bundle
API es compatible actualmente? Discutiremos esto al final de este artículo.
Cómo utilizar el recurso
Swift creará un código estándar para que pueda acceder fácilmente a los recursos Bundle
.
extension Bundle { /// The bundle associated with the current Swift module. static let module: Bundle = { ... }() }
Ejemplo:
import Foundation let picture = Bundle.module.path(forResource: "image", ofType: "png") print(picture) // Optional("/Users/wendyliga/resource-spm/.build/x86_64-apple-macosx/debug/resource-spm_resource-spm.bundle/image.png")
Recursos localizados
Gracias a David Hart con SE-0278
, Swift 5.3
admitirá recursos localizados para Swift Package Manager
.
let package = Package( name: "resource-spm", defaultLocalization: "en", ... )
Deberías agregar defaultLocalization
para usted package
init para decirle a Swift que su paquete admitirá la localización. defaultLocalization
Swift también lo utilizará como respaldo si algún recurso localizado no tiene una localización precisa.
Luego crea tu recurso localizado creando un language-tag.lproj
directorio cuya etiqueta de idioma se basará en el Etiqueta de idioma IETF (aprende más en Documentación de CFBundleDevelopmentRegion
).
En Package.swift
, Agrego la declaración del directorio de recursos:
.process("Resources")
En mi ejemplo, crearé varias localizaciones: en
(Inglés) por defecto, es
(Español), id
(Indonesia) y fr-CH
(Francés (Suiza), como etiquetas de idioma IETF
.
Además, como mencioné anteriormente, debes usar .process
incluso en el contexto de localización (el caso de uso de localización debe obligarlo a crear un directorio y debe conservar su estructura cuando se compila para empaquetar). Swift hará su magia para que esto suceda incluso sin .copy
.
Cada archivo tendrá un hello_tag
cadena localizada, por ejemplo, Francia:
"hello_world" = "Bonjour le monde";
Entonces puedes llamar a esto con:
NSLocalizedString("hello_world", bundle: .module, comment: "")
De forma predeterminada, el código anterior buscará hello_world
en cadenas localizadas disponibles.
Puede hacer lo mismo con otros tipos de archivos, como imágenes, sonido o JSON, colocando cada archivo en su directorio localizado respectivo, al igual que el ejemplo Localizable.strings
.
¿Qué sucede si deseo acceder a recursos localizados por la fuerza?
Si, por ejemplo, desea acceder a otros recursos de idiomas que no son el idioma predeterminado actual en el cliente, puede acceder al paquete de idiomas correspondiente.
Aquí hay un poco de ayuda de funciones:
/// source: https://github.com/apple/swift-package-manager/pull/2535/files#diff-cc8e61e90b098f4e9ebc74503408eaa8 func localizationBundle(forLanguage language: String) -> Bundle? { if let path = Bundle.module.path(forResource: language, ofType: "lproj") { return Bundle(path: path) } else { return nil } } if let indonesiaBundle = localizationBundle(forLanguage: "id") { print(NSLocalizedString("hello_world", bundle: indonesiaBundle, comment: "")) // access image let image = UIImage(named: "MyIcon", in: indonesiaBundle, compatibleWith: UITraitCollection(userInterfaceStyle: .dark))}
Terminando las cosas
Entonces, ¿estás emocionado con este nuevo administrador de paquetes Swift?
Antes de Swift 5.3
, esto significaba que muchas bibliotecas del administrador de paquetes Swift o ejecutables que desean incluir otros archivos fuera del archivo Swift, necesitan usar el formato xcodeproj
. Pero ese problema ya no existe: ahora puede agregar recursos a su proyecto de GDS
.
Ahora puede agregar soporte de localización nativo, traer archivos JSON o archivos de audio a su proyecto SPM.
Eso es todo de mi parte. Gracias por tu tiempo, ¡nos vemos en el próximo artículo!
Añadir comentario