swift struct nsbundle

swift - ¿Cómo obtener un paquete para una estructura?



nsbundle (3)

En Swift, puedes llamar

let bundle = NSBundle(forClass: self.dynamicType)

en cualquier clase y obtener el paquete actual. Si NSBundle.mainBundle() esto fallará al obtener el paquete correcto cuando, por ejemplo, se ejecuten pruebas unitarias.

Entonces, ¿cómo puede obtener el paquete actual para una struct Swift?


Actualizado para Swift 3.0+:

struct Foo { class Bar {} static var fooBundle: Bundle { return Bundle(for: Foo.Bar.self) } }


La mejor solución aquí depende de para qué necesitas un paquete.

¿Es para buscar recursos que existen solo en una aplicación, marco o paquete de extensión específicos que se sabe que se cargan cuando se ejecuta el código que está escribiendo? En ese caso, es posible que desee utilizar init(identifier:) lugar de buscar dinámicamente el paquete que define un determinado tipo.

Tenga cuidado con "sigue el tipo" búsquedas de paquetes. Por ejemplo, si una clase de marco Foo usa NSBundle(forClass: self.dynamicType) para cargar un recurso, una subclase de Foo definida por la aplicación que carga ese marco terminará buscando el paquete de la aplicación en lugar del paquete del marco.

Si necesita una búsqueda de paquetes "sigue al tipo" para una estructura (o enumeración), una solución que podría ser útil es definir una clase como un subtipo:

struct Foo { class Bar {} static var fooBundle: NSBundle { return NSBundle(forClass: Foo.Bar.self) } }

Tenga en cuenta que aquí no hay nada dinámico, porque no es necesario que haya nada: cada Foo proviene de la misma definición de tipo (porque las estructuras no pueden heredar), por lo que su tipo estático coincide con su tipo dinámico.

(Es cierto que un NSBundle(forType:) que podría manejar estructuras, enumeraciones y protocolos podría ser una buena solicitud de características . Aunque imagino que podría ser difícil hacer que maneje las extensiones y todo ...)


No puede tomar un NSBundle de una estructura, porque las estructuras no pueden heredar.

La clase NSBundle espera siempre una clase que sea un subconjunto de NSObject, en este caso solo las clases pueden heredar de ella.

Trate de usar una estructura si las instancias del tipo son pequeñas y comúnmente duran poco o están comúnmente incrustadas en otros objetos. Para los demás casos usaremos clase.

Usualmente solo uso estructuras en caso de:

  • Objetos de modelos y entidades.
  • Inmutable (no para todos, pero en la mayoría de los casos)
  • Tamaño de instancia inferior a 16 bytes.