Equivalente rápido de [NSBundle bundleForClass: [self class]]


131

Cuál es el equivalente rápido del siguiente código:

[NSBundle bundleForClass:[self class]]

Necesito cargar recursos del paquete de prueba (datos JSON)

Respuestas:


222

Nunca usado, pero creo que debería ser esto:

Swift <= 2.x

NSBundle(forClass: self.dynamicType)

Swift 3.x

Bundle(for: type(of: self))

39
El autocompletado en la versión actual de Xcode actúa como si no tuviera idea de lo que estás hablando, pero sí funciona.
David Beck

44
en la versión 2.1: NSBundle (forClass: self)
zwebie

El hilo de la evolución para considerar cambiar esto está en github.com/apple/swift-evolution/blob/master/proposals/…
William Entriken

1
La solución no funciona para los tipos de valor. Considere usar init?(identifier: String)donde el identificador es la identificación del paquete de su objetivo. Otra solución para los tipos de valor es declarar una clase vacía dentro de su tipo de valor. Ejemplo de la última solución: Bundle(for: Foo.Bar.self)donde Foo- su estructura, Bar- alguna clase interna.
Vadim Bulavin

1
Esto no funciona en Swift 3.1. type(of: self)volverá ClassName.Typey llamar Bundle(for:)a eso devuelve el paquete principal
adib

38

Swift 3:

Bundle(for: type(of: self))

3
La solución no funciona para los tipos de valor. Considere usar init?(identifier: String)donde el identificador es la identificación del paquete de su objetivo. Si no desea codificar el ID del paquete, use Bundle(for: Foo.Bar.self)where Foo- your struct, Bar- some class.
Vadim Bulavin

12

Personalmente me gusta:

let bun = NSBundle(forClass: self.classForCoder)



7

La respuesta seleccionada no me funcionó en un método estático de una subclase UIView, pero encontré esto:

Bundle(for: self.classForCoder)

Esto también funciona cuando desea obtener el Bundleobjetivo de prueba.


6

Si estás trabajando en una clase, entonces

Bundle(for: type(of: self))

A veces puede trabajar en una estructura, luego debe usar cualquier clase en el paquete

Bundle(for: AnyClassInTheBundle.self)

4

Cargando el xib para dynamicType de la clase

    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: "CellForAlert", bundle: bundle)
    let view =  nib.instantiateWithOwner(self, options: nil).first as! UIView
    view.frame = bounds
    view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    self.addSubview(view);

-1

En Swift 3.0, puede usar:

func kZWGetBundle() -> Bundle{
    return Bundle(for: AnyClass.self as! AnyClass)
}

1
Simplemente se bloquea
Alexander Belyavskiy

También se bloquea para mí, voté por usar forzar desenvolver en código de muestra.
SafeFastExpressive
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.