Swift equivalente a [NSBundle bundleForClass: [auto class]]

131

Qual é o equivalente rápido do próximo código:

[NSBundle bundleForClass:[self class]]

Preciso carregar recursos do pacote de teste (dados JSON)

Danil
fonte

Respostas:

222

Nunca usei, mas acho que deveria ser o seguinte:

Swift <= 2.x

NSBundle(forClass: self.dynamicType)

Swift 3.x

Bundle(for: type(of: self))
Antonio
fonte
39
O preenchimento automático na versão atual do Xcode age como se não tivesse idéia do que você está falando, mas realmente funciona.
David Beck
4
na versão 2.1: NSBundle (forClass: self)
zwebie
O fio evolução considerar mudar esta é a github.com/apple/swift-evolution/blob/master/proposals/...
William Entriken
1
A solução não funciona para tipos de valor. Considere usar init?(identifier: String)onde identificador é o ID do pacote do seu destino. Outra solução para tipos de valor é declarar uma classe vazia dentro do seu tipo de valor. Exemplo da última solução: Bundle(for: Foo.Bar.self)where Foo- your struct, Bar- alguma classe interna.
Vadim Bulavin
1
Isso não funciona no Swift 3.1. type(of: self)vai voltar ClassName.Typee chamando Bundle(for:)para que os retornos do pacote principal
adib
38

Swift 3:

Bundle(for: type(of: self))
Alexander Belyavskiy
fonte
3
A solução não funciona para tipos de valor. Considere usar init?(identifier: String)onde identificador é o ID do pacote do seu destino. Se você não deseja codificar o código do pacote, use Bundle(for: Foo.Bar.self)where Foo- sua estrutura, Bar- alguma classe interna.
Vadim Bulavin
12

Eu pessoalmente gosto de:

let bun = NSBundle(forClass: self.classForCoder)
Sakiboy
fonte
9
let bundle = NSBundle(forClass:object_getClass(self))
Mark Semsel
fonte
9

Swift 5

Bundle(for: Self.self)
Oleh Kudinov
fonte
7

A resposta selecionada não funcionou para mim no método estático de uma subclasse UIView, mas achei o seguinte:

Bundle(for: self.classForCoder)

Isso também funciona quando você deseja obter o Bundlealvo dentro de um teste.

Siegfoult
fonte
6

Se você estiver trabalhando em uma aula, então

Bundle(for: type(of: self))

Às vezes, você pode trabalhar em uma estrutura e, em seguida, precisa usar qualquer classe no pacote

Bundle(for: AnyClassInTheBundle.self)
William Hu
fonte
4

Carregando o xib para dynamicType da classe

    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);
AyAz
fonte
-1

No Swift 3.0, você pode usar:

func kZWGetBundle() -> Bundle{
    return Bundle(for: AnyClass.self as! AnyClass)
}
InitialC
fonte
1
Ele apenas trava #
Alexander Belyavskiy
Crashes para mim também, votado para baixo usando força desembrulhar no código de exemplo.
SafeFastExpressive