从mainBundle载入

在一些stream行的开源swift项目中。 我注意到以下方法用于从主包加载文件。

@objc class TestClass: NSObject { } let bundle = NSBundle(forClass: TestClass.self) let path = bundle.pathForResource(filename, ofType: "json") 

我们也可以使用这种方法。

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

为什么有人会select第二种方法呢?

这将返回包含TestClass类的包:

 NSBundle(forClass: TestClass.self) 

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

 NSBundle.mainBundle() 

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

例如,CocoaPods中的所有Swift库都使用dynamic框架进行集成,并将它们部署在主包中的不同包中。 所以所有的框架都必须使用embedded式包来访问他们的资源。

我build议使用第一种方法( NSBundle(forClass:)方法)来提高代码的可移植性。 而且在创builddynamic框架时是必需的。