Лучшее решение здесь зависит от того, для чего вам нужен пакет.
Это поиск ресурсов, существующих только в определенном приложении, фреймворке или пакете расширений, которые, как известно, загружаются при запуске кода, который вы пишете? В этом случае вы можете использовать init(identifier:)
вместо динамического поиска пакета, определяющего определенный тип.
Остерегайтесь поиска пакетов "следует за типом". Например, если класс фреймворка Foo
использует NSBundle(forClass: self.dynamicType)
для загрузки ресурса, подкласс Foo
, определенный приложением, загружающим этот фреймворк, в конечном итоге будет искать в пакете приложения, а не в пакете фреймворка.
Если вам нужен поиск пакета «следует за типом» для структуры (или перечисления), один обходной путь, который может оказаться полезным, — это определить класс как подтип:
struct Foo {
class Bar {}
static var fooBundle: NSBundle { return NSBundle(forClass: Foo.Bar.self) }
}
Обратите внимание, что здесь нет ничего динамического, потому что ничего не должно быть — каждый Foo
исходит из определения одного и того же типа (поскольку структуры не могут наследоваться), поэтому его статический тип соответствует его динамическому типу.
(Следует признать, что NSBundle(forType:)
, который может обрабатывать структуры, перечисления и протоколы, мог бы сделать хороший запрос функции. Хотя я полагаю, что это может быть сложно сделать он обрабатывает расширения и все такое...)
person
rickster
schedule
22.03.2016
NSBundle
, помогающее, поэтому я могу продолжать работать, пока не будет найдено правильное решение. - person Max Chuquimia   schedule 12.08.2015