Swift equivalente di [NSBundle bundleForClass: [self class]]


131

Qual è l'equivalente rapido del prossimo codice:

[NSBundle bundleForClass:[self class]]

Ho bisogno di caricare risorse dal bundle di test (dati JSON)

Risposte:


222

Mai usato, ma penso che dovrebbe essere questo:

Swift <= 2.x

NSBundle(forClass: self.dynamicType)

Swift 3.x

Bundle(for: type(of: self))

39
Il completamento automatico nella versione corrente di Xcode si comporta come se non avesse idea di cosa tu stia parlando, ma in effetti funziona.
— David Beck,

4
nella versione 2.1: NSBundle (forClass: self)
— zwebie,

Il thread di evoluzione da considerare per cambiare questo è su github.com/apple/swift-evolution/blob/master/proposals/…
— William Entriken

1
La soluzione non funziona per i tipi di valore. Prendi in considerazione l'utilizzo di init?(identifier: String)dove identificatore è l'ID bundle del tuo target. Un'altra soluzione per i tipi di valore è dichiarare una classe vuota all'interno del tipo di valore. Esempio di quest'ultima soluzione: Bundle(for: Foo.Bar.self)dove Foo- la tua struttura, Bar- una classe interna.
— Vadim Bulavin,

1
Questo non funziona in Swift 3.1. type(of: self)tornerà ClassName.Typee chiamando Bundle(for:)a quello restituirà il pacchetto principale
— adib

38

Swift 3:

Bundle(for: type(of: self))

3
La soluzione non funziona per i tipi di valore. Prendi in considerazione l'utilizzo di init?(identifier: String)dove identificatore è l'ID bundle del tuo target. Se non vuoi codificare l'ID del bundle, usa Bundle(for: Foo.Bar.self)dove Foo- la tua struttura Bar- una classe interna.
— Vadim Bulavin,

12

Personalmente mi piace:

let bun = NSBundle(forClass: self.classForCoder)



7

La risposta selezionata non ha funzionato per me in un metodo statico di una sottoclasse UIView, ma ho trovato questo:

Bundle(for: self.classForCoder)

Questo funziona anche quando si desidera ottenere l' Bundleobiettivo all'interno di un test.


6

Se stai lavorando a una lezione allora

Bundle(for: type(of: self))

A volte potresti lavorare in una struttura, quindi devi usare qualsiasi classe nel bundle

Bundle(for: AnyClassInTheBundle.self)

4

Caricamento di xib per dynamicType della 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

In Swift 3.0, puoi utilizzare:

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

1
Si blocca e basta
— Alexander Belyavskiy il

Si arresta in modo anomalo anche per me, votato in negativo per l'utilizzo della funzione Unrap Unrap nel codice di esempio.
— SafeFastExpressive
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.