[NSBundle bundleForClass:[self class]]と同等のSwift


131

次のコードの迅速な同等物は何ですか:

[NSBundle bundleForClass:[self class]]

テストバンドルからリソースを読み込む必要があります(JSONデータ)

回答:


222

使用したことはありませんが、これは次のようになります:

スウィフト<= 2.x

NSBundle(forClass: self.dynamicType)

Swift 3.x

Bundle(for: type(of: self))

39
Xcodeの現在のバージョンのオートコンプリートは、何を話しているのかまったくわからないように動作しますが、実際に機能します。
David Beck

4
バージョン2.1の場合:NSBundle(forClass:self)
zwebie

これを変更することを検討するエボリューションスレッドはgithub.com/apple/swift-evolution/blob/master/proposals/…にあります
William Entriken

1
ソリューションは値タイプに対して機能しません。init?(identifier: String)identifierがターゲットのバンドルIDである場所の使用を検討してください。値型の別の解決策は、値型内で空のクラスを宣言することです。後者のソリューションの例:Bundle(for: Foo.Bar.self)ここでFoo-あなたの構造体Bar-一部の内部クラス。
Vadim Bulavin 2017

1
これはSwift 3.1では機能しません。type(of: self)戻りClassName.Type、それを呼び出すBundle(for:)メインバンドル
adib 2017

38

スウィフト3:

Bundle(for: type(of: self))

3
ソリューションは値タイプに対して機能しません。init?(identifier: String)identifierがターゲットのバンドルIDである場所の使用を検討してください。あなたは、バンドルID、使用ハードコーディングしたくない場合は、あなたの構造体、 - -いくつかの内部クラスを。Bundle(for: Foo.Bar.self)FooBar
Vadim Bulavin 2017




7

選択した答えは、UIViewサブクラスの静的メソッドでは機能しませんでしたが、次のことがわかりました。

Bundle(for: self.classForCoder)

これはBundle、テストターゲット内で取得したい場合にも機能します。


6

クラスで作業している場合

Bundle(for: type(of: self))

時には構造体で作業する可能性があり、バンドル内の任意のクラスを使用する必要があります

Bundle(for: AnyClassInTheBundle.self)

4

クラスのdynamicTypeのxibをロードする

    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
クラッシュするだけ
Alexander Belyavskiy

私にとってもクラッシュし、サンプルコードで強制アンラップを使用することに反対票が投じられました。
SafeFastExpressive 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.