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.