Equivalent Swift de [NSBundle bundleForClass: [self class]]

131

Quel est l'équivalent rapide du code suivant:

[NSBundle bundleForClass:[self class]]

J'ai besoin de charger des ressources à partir du bundle de test (données JSON)

Danil
la source

Réponses:

222

Jamais utilisé, mais je pense que ça devrait être ça:

Swift <= 2.x

NSBundle(forClass: self.dynamicType)

Swift 3.x

Bundle(for: type(of: self))
Antonio
la source
39
La saisie semi-automatique dans la version actuelle de Xcode agit comme si elle n'avait aucune idée de ce dont vous parlez, mais cela fonctionne effectivement.
David Beck
4
dans la version 2.1: NSBundle (forClass: self)
zwebie
Le fil d'évolution à envisager de changer cela se trouve sur github.com/apple/swift-evolution/blob/master/proposals/…
William Entriken
1
La solution ne fonctionne pas pour les types valeur. Pensez à utiliser init?(identifier: String)où identifier est l'ID de groupe de votre cible. Une autre solution pour les types valeur consiste à déclarer une classe vide dans votre type valeur. Exemple de cette dernière solution: Bundle(for: Foo.Bar.self)Foo- votre structure, Bar- une classe interne.
Vadim Bulavin
1
Cela ne fonctionne pas dans Swift 3.1. type(of: self)reviendra ClassName.Typeet appellera Bundle(for:)à qui renvoie le paquet principal
adib
38

Swift 3:

Bundle(for: type(of: self))
Alexandre Belyavskiy
la source
3
La solution ne fonctionne pas pour les types valeur. Pensez à utiliser init?(identifier: String)où identifier est l'ID de groupe de votre cible. Si vous ne voulez pas coder en dur l'ID du bundle, utilisez Bundle(for: Foo.Bar.self)where Foo- votre structure, Bar- une classe interne.
Vadim Bulavin
12

J'aime personnellement:

let bun = NSBundle(forClass: self.classForCoder)
Sakiboy
la source
9
let bundle = NSBundle(forClass:object_getClass(self))
Mark Semsel
la source
9

Swift 5

Bundle(for: Self.self)
Oleh Kudinov
la source
7

La réponse sélectionnée n'a pas fonctionné pour moi dans une méthode statique d'une sous-classe UIView, mais j'ai trouvé ceci:

Bundle(for: self.classForCoder)

Cela fonctionne également lorsque vous souhaitez obtenir le Bundledans une cible de test.

Siegfoult
la source
6

Si vous travaillez sur une classe alors

Bundle(for: type(of: self))

Parfois, vous pouvez travailler dans une structure, puis vous devez utiliser n'importe quelle classe du bundle

Bundle(for: AnyClassInTheBundle.self)
William Hu
la source
4

Chargement du xib pour dynamicType de la classe

    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
la source
-1

Dans Swift 3.0, vous pouvez utiliser:

func kZWGetBundle() -> Bundle{
    return Bundle(for: AnyClass.self as! AnyClass)
}
InitialC
la source
1
Il plante juste
Alexander Belyavskiy
Des plantages pour moi aussi, j'ai voté contre l'utilisation du déballage forcé dans un exemple de code.
SafeFastExpressive