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)

Danil
fuente

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))
Antonio
fuente
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))
Alexander Belyavskiy
fuente
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)
Sakiboy
fuente
9
let bundle = NSBundle(forClass:object_getClass(self))
Mark Semsel
fuente
9

Swift 5

Bundle(for: Self.self)
Oleh Kudinov
fuente
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.

Siegfoult
fuente
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)
William Hu
fuente
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);
AyAz
fuente
-1

En Swift 3.0, puede usar:

func kZWGetBundle() -> Bundle{
    return Bundle(for: AnyClass.self as! AnyClass)
}
InitialC
fuente
1
Simplemente se bloquea
Alexander Belyavskiy
También se bloquea para mí, voté por usar forzar desenvolver en código de muestra.
SafeFastExpressive