Swift эквивалент [NSBundle bundleForClass: [собственный класс]]

131

Что такое быстрый эквивалент следующего кода:

[NSBundle bundleForClass:[self class]]

Мне нужно загрузить ресурсы из тестового пакета (данные JSON)

Данил
источник

Ответы:

222

Никогда не использовал, но думаю, должно быть так:

Swift <= 2.x

NSBundle(forClass: self.dynamicType)

Swift 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

Swift 3:

Bundle(for: type(of: self))
Александр Белявский
источник
3
Решение не работает для типов значений. Подумайте об использовании init?(identifier: String)где идентификатор - это идентификатор пакета вашей цели. Если вы не хотите жестко кодировать идентификатор пакета, используйте Bundle(for: Foo.Bar.self)where Foo- ваша структура Bar- некоторый внутренний класс.
Вадим Булавин
12

Мне лично нравятся:

let bun = NSBundle(forClass: self.classForCoder)
Sakiboy
источник
9
let bundle = NSBundle(forClass:object_getClass(self))
Марк Семсель
источник
7

Выбранный ответ не работал у меня в статическом методе подкласса UIView, но я обнаружил следующее:

Bundle(for: self.classForCoder)

Это также работает, когда вы хотите достичь Bundleтестовой цели.

Siegfoult
источник
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)
}
InitialC
источник
1
Просто вылетает
Александр Белявский
Сбои для меня тоже, проголосовали за использование принудительного развертывания в образце кода.
SafeFastExpressive