Setara dengan cepat dari [NSBundle bundleForClass: [kelas mandiri]]

131

Apa yang setara dengan kode berikutnya:

[NSBundle bundleForClass:[self class]]

Saya perlu memuat sumber daya dari bundel uji (data JSON)

Danil
sumber

Jawaban:

222

Tidak pernah digunakan, tapi saya pikir seharusnya ini:

Cepat <= 2.x

NSBundle(forClass: self.dynamicType)

Cepat 3.x

Bundle(for: type(of: self))
Antonio
sumber
39
Autocomplete dalam versi Xcode saat ini bertindak seperti itu tidak tahu apa yang Anda bicarakan, tetapi memang berhasil.
David Beck
4
dalam versi 2.1: NSBundle (forClass: self)
zwebie
Utas evolusi untuk mempertimbangkan perubahan ini ada di github.com/apple/swift-evolution/blob/master/proposals/…
William Entriken
1
Solusinya tidak bekerja untuk tipe nilai. Pertimbangkan untuk menggunakan di init?(identifier: String)mana pengidentifikasi adalah bundel ID target Anda. Solusi lain untuk tipe nilai adalah dengan mendeklarasikan kelas kosong di dalam tipe nilai Anda. Contoh dari solusi terakhir: di Bundle(for: Foo.Bar.self)mana Foo- struct Anda, Bar- beberapa kelas batin.
Vadim Bulavin
1
Ini tidak berfungsi di Swift 3.1. type(of: self)akan kembali ClassName.Typedan memanggil Bundle(for:)yang mengembalikan bundel utama
adib
38

Swift 3:

Bundle(for: type(of: self))
Alexander Belyavskiy
sumber
3
Solusinya tidak bekerja untuk tipe nilai. Pertimbangkan untuk menggunakan di init?(identifier: String)mana pengidentifikasi adalah bundel ID target Anda. Jika Anda tidak ingin meng-hardcode ID bundel, gunakan di Bundle(for: Foo.Bar.self)mana Foo- struct Anda, Bar- beberapa kelas dalam.
Vadim Bulavin
12

Saya pribadi suka:

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

Cepat 5

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

Jawaban yang dipilih tidak bekerja untuk saya dalam metode statis subkelas UIView, tetapi saya menemukan ini:

Bundle(for: self.classForCoder)

Ini juga berfungsi ketika Anda ingin mendapatkan Bundledalam target pengujian.

Siegfoult
sumber
6

Jika Anda mengerjakan sebuah kelas, maka

Bundle(for: type(of: self))

Kadang-kadang Anda dapat bekerja dalam sebuah struct, maka Anda perlu menggunakan kelas apa pun di bundel

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

Memuat xib untuk dynamicType kelas

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

Di Swift 3.0, Anda dapat menggunakan:

func kZWGetBundle() -> Bundle{
    return Bundle(for: AnyClass.self as! AnyClass)
}
InitialC
sumber
1
Itu hanya crash
Alexander Belyavskiy
Gangguan untuk saya juga, turun memilih untuk menggunakan kekuatan membuka kode sampel.
SafeFastExpressive