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)

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

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

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)



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.


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)

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

-1

Di Swift 3.0, Anda dapat menggunakan:

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

1
Itu hanya crash
Alexander Belyavskiy

Gangguan untuk saya juga, turun memilih untuk menggunakan kekuatan membuka kode sampel.
SafeFastExpressive
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.