Швидкий еквівалент [NSBundle bundleForClass: [самоклас]]


131

Що таке швидкий еквівалент наступного коду:

[NSBundle bundleForClass:[self class]]

Мені потрібні ресурси для завантаження з тестового пакету (дані JSON)

Відповіді:


222

Ніколи не використовувався, але я думаю, це має бути так:

Швидкий <= 2.x

NSBundle(forClass: self.dynamicType)

Швидкий 3.x

Bundle(for: type(of: self))

39
Автозаповнення в поточній версії Xcode діє так, ніби він не має уявлення про те, про що ви говорите, але це дійсно працює.
Девід Бек

4
у версії 2.1: NSBundle (forClass: self)
zwebie

Еволюційний потік для розгляду цього питання можна знайти на веб-
Вільям Ентрікен

1
Рішення не працює для типів значень. Подумайте про те, init?(identifier: String)де ідентифікатор - ідентифікатор пакета вашої цілі. Іншим рішенням для типів значень є оголошення порожнього класу всередині вашого типу значень. Приклад останнього рішення: Bundle(for: Foo.Bar.self)де Foo- ваша структура, Bar- якийсь внутрішній клас.
Вадим Булавін

1
У Swift 3.1 це не працює. type(of: self)повернеться ClassName.Typeі заклик Bundle(for:)до цього повертає основний пакет
адиб

38

Швидкий 3:

Bundle(for: type(of: self))

3
Рішення не працює для типів значень. Подумайте про те, init?(identifier: String)де ідентифікатор - ідентифікатор пакета вашої цілі. Якщо ви не хочете жорстко кодувати ідентифікатор пакета, використовуйте Bundle(for: Foo.Bar.self)де Foo- ваш структура, Bar- якийсь внутрішній клас.
Вадим Булавін




7

Вибрана відповідь не працювала для мене в статичному методі підкласу UIView, але я виявив це:

Bundle(for: self.classForCoder)

Це також працює, коли ви хочете отримати Bundleтестову ціль.


6

Якщо ви працюєте над класом, тоді

Bundle(for: type(of: self))

Іноді ви можете працювати в структурі, тоді вам потрібно використовувати будь-який клас у групі

Bundle(for: AnyClassInTheBundle.self)

4

Завантаження xib для dynamicType класу

    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

У Swift 3.0 ви можете використовувати:

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

1
Це просто збої
Олександр Белявський

Збої і для мене, вниз проголосували за використання сили відкручування у зразковому коді.
SafeFastExpressive
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.