Szybki odpowiednik [NSBundle bundleForClass: [własna klasa]]

132

Co to jest szybki odpowiednik następnego kodu:

[NSBundle bundleForClass:[self class]]

Potrzebuję zasobów ładowania z pakietu testowego (dane JSON)

Danil
źródło

Odpowiedzi:

226

Nigdy nie używane, ale myślę, że powinno być tak:

Swift <= 2.x

NSBundle(forClass: self.dynamicType)

Swift 3.x

Bundle(for: type(of: self))
Antonio
źródło
39
Autouzupełnianie w aktualnej wersji Xcode działa tak, jakby nie miało pojęcia, o czym mówisz, ale rzeczywiście działa.
David Beck
4
w wersji 2.1: NSBundle (forClass: self)
zwebie Kwietnia
Wątek ewolucji, który należy rozważyć, aby to zmienić, znajduje się na github.com/apple/swift-evolution/blob/master/propeals/ ...
William Entriken
1
Rozwiązanie nie działa dla typów wartości. Rozważ użycie init?(identifier: String)gdzie identyfikator jest identyfikatorem pakietu celu. Innym rozwiązaniem dla typów wartości jest zadeklarowanie pustej klasy wewnątrz typu wartości. Przykład drugiego rozwiązania: Bundle(for: Foo.Bar.self)gdzie Foo- twoja struktura, Bar- jakaś klasa wewnętrzna.
Vadim Bulavin
1
To nie działa w Swift 3.1. type(of: self)powróci, ClassName.Typea wywołanie Bundle(for:)tego spowoduje zwrócenie głównego pakietu
adib
39

Swift 3:

Bundle(for: type(of: self))
Aleksandra Belyavskiego
źródło
3
Rozwiązanie nie działa dla typów wartości. Rozważ użycie init?(identifier: String)gdzie identyfikator jest identyfikatorem pakietu celu. Jeśli nie chcesz zakodować na stałe identyfikatora pakietu, użyj Bundle(for: Foo.Bar.self)where Foo- your struct, Bar- some inside class.
Vadim Bulavin
12

Osobiście lubię:

let bun = NSBundle(forClass: self.classForCoder)
Sakiboy
źródło
11

Szybki 5

Bundle(for: Self.self)
Oleh Kudinov
źródło
9
let bundle = NSBundle(forClass:object_getClass(self))
Mark Semsel
źródło
7

Wybrana odpowiedź nie zadziałała dla mnie w metodzie statycznej podklasy UIView, ale znalazłem to:

Bundle(for: self.classForCoder)

Działa to również, gdy chcesz uzyskać Bundlecel testowy.

Siegfoult
źródło
6

Jeśli pracujesz na zajęciach, to

Bundle(for: type(of: self))

Czasami możesz pracować w strukturze, wtedy musisz użyć dowolnej klasy w pakiecie

Bundle(for: AnyClassInTheBundle.self)
William Hu
źródło
4

Ładowanie xib dla dynamicType klasy

    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
źródło
-1

W Swift 3.0 możesz użyć:

func kZWGetBundle() -> Bundle{
    return Bundle(for: AnyClass.self as! AnyClass)
}
InitialC
źródło
1
Po prostu się wywala
Alexander Belyavskiy,
U mnie też się zawiesza, Down głosował za użyciem wymuszonego rozpakowywania w przykładowym kodzie.
SafeFastExpressive