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- некоторый внутренний класс.
Вадим Булавин




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.