Ответ 1
Лучшее решение здесь зависит от того, для чего вам нужен комплект.
Нужно ли искать ресурсы, которые существуют только в определенном пакете приложений, фреймворков или расширений, которые, как известно, загружаются при запуске кода, который вы пишете? В этом случае вы можете использовать init(identifier:)
вместо динамического поиска пакета, который определяет определенный тип.
Остерегайтесь "следует за поиском пакетов". Например, если класс framework Foo
использует NSBundle(forClass: self.dynamicType)
для загрузки ресурса, подкласс Foo
, определяемый приложением, загружающим эту структуру, в конечном итоге будет выглядеть в комплекте приложений вместо пакета структуры.
Если вам нужно "следовать за поиском пакетов" для структуры (или перечисления), одним из способов, которые могут оказаться полезными, является определение класса как подтипа:
struct Foo {
class Bar {}
static var fooBundle: NSBundle { return NSBundle(forClass: Foo.Bar.self) }
}
Обратите внимание, что здесь нет ничего динамического, потому что ничего не должно быть - каждый Foo
поступает из одного и того же определения типа (потому что structs не может наследовать), поэтому его статический тип соответствует его динамическому типу.
(По общему признанию, NSBundle(forType:)
, который мог бы обрабатывать структуры, перечисления и протоколы, мог бы сделать приятный запрос функции. Хотя я думаю, что было бы сложно сделать это обрабатывать расширения и все...)