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

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

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

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)



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 .


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)

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

-1

In Swift 3.0 können Sie Folgendes verwenden:

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.