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)

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))

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))

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)



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.


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)

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);

-1

Dans Swift 3.0, vous pouvez utiliser:

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.