Schnelles Äquivalent zu [NSBundle bundleForClass: [self class]]

131

Was ist schnelles Äquivalent zum nächsten Code:

[NSBundle bundleForClass:[self class]]

Ich benötige Ressourcen aus dem Testpaket laden (JSON-Daten).

Danil
quelle

Antworten:

222

Nie benutzt, aber ich denke es sollte so sein:

Swift <= 2.x.

NSBundle(forClass: self.dynamicType)

Swift 3.x.

Bundle(for: type(of: self))
Antonio
quelle
39
Die automatische Vervollständigung in der aktuellen Version von Xcode verhält sich so, als hätte es keine Ahnung, wovon Sie sprechen, aber es funktioniert tatsächlich.
David Beck
4
in Version 2.1: NSBundle (forClass: self)
zwebie
Der Evolutionsthread, um dies zu ändern, ist unter github.com/apple/swift-evolution/blob/master/proposals/…
William Entriken am
1
Die Lösung funktioniert nicht für Werttypen. Überlegen Sie, init?(identifier: String)wo der Bezeichner die Bundle-ID Ihres Ziels ist. Eine andere Lösung für Werttypen besteht darin, eine leere Klasse in Ihrem Werttyp zu deklarieren. Beispiel für die letztere Lösung: Bundle(for: Foo.Bar.self)wo Foo- Ihre Struktur, Bar- eine innere Klasse.
Vadim Bulavin
1
Dies funktioniert in Swift 3.1 nicht. type(of: self)wird zurückkehren ClassName.Typeund ein Aufruf Bundle(for:)dazu gibt das
Hauptpaket
38

Swift 3:

Bundle(for: type(of: self))
Alexander Belyavskiy
quelle
3
Die Lösung funktioniert nicht für Werttypen. Überlegen Sie, init?(identifier: String)wo der Bezeichner die Bundle-ID Ihres Ziels ist. Wenn Sie die Bundle-ID nicht fest codieren möchten, verwenden Sie Bundle(for: Foo.Bar.self)where Foo- your struct, Bar- eine innere Klasse.
Vadim Bulavin
12

Ich persönlich mag:

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

Swift 5

Bundle(for: Self.self)
Oleh Kudinov
quelle
7

Die ausgewählte Antwort funktionierte bei einer statischen Methode einer UIView-Unterklasse nicht, aber ich fand Folgendes:

Bundle(for: self.classForCoder)

Dies funktioniert auch, wenn Sie das Bundleinnerhalb eines Testziels erhalten möchten .

Siegfoult
quelle
6

Wenn Sie an einer Klasse arbeiten, dann

Bundle(for: type(of: self))

Manchmal arbeiten Sie in einer Struktur, dann müssen Sie eine beliebige Klasse im Bundle verwenden

Bundle(for: AnyClassInTheBundle.self)
William Hu
quelle
4

Laden der xib für dynamicType der Klasse

    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
quelle
-1

In Swift 3.0 können Sie Folgendes verwenden:

func kZWGetBundle() -> Bundle{
    return Bundle(for: AnyClass.self as! AnyClass)
}
InitialC
quelle
1
Es stürzt nur ab
Alexander Belyavskiy
Abstürze auch für mich, Down stimmte für die Verwendung von Force Unwrap im Beispielcode.
SafeFastExpressive