Loading from mainBundle

时间:2016-04-07 10:55:51

标签: ios swift

In a some popular open source swift project. I noticed following approach used to load a file from main bundle.

@objc class TestClass: NSObject { }

let bundle = NSBundle(forClass: TestClass.self)
let path = bundle.pathForResource(filename, ofType: "json")

We can also use this approach.

let path = NSBundle.mainBundle().pathForResource(filename, ofType: "json")

Why would someone choose first approach over second one?

1 个答案:

答案 0 :(得分:3)

这将返回包含TestClass类的包:

NSBundle(forClass: TestClass.self)

虽然这会返回应用程序的主要包:

NSBundle.mainBundle()

如果您从应用程序代码执行此代码,它将始终返回您的主包。但是如果该类包含在不同的库或框架中,它将返回包含它的包。

例如,CocoaPods中的所有Swift库都使用动态框架集成,并且它们部署在主bundle内的不同bundle中。因此,所有框架都必须使用嵌入式捆绑包来访问其资源。

我建议使用第一种方法(NSBundle(forClass:)方法)来提高代码的可移植性。在创建动态框架时需要它。