2016-04-07 35 views
1

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

@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") 

为什么有人会选择第二种方法?

+1

如果您的项目中有不同的软件包(比如库或框架),如果您使用第一种方法,则可以确保从外部软件包明确加载正确的内容。 – holex

回答

3

这将返回一个包含TestClass类捆:

NSBundle(forClass: TestClass.self) 

这枚返回应用程序的主束:

NSBundle.mainBundle() 

如果您从您的应用程序代码执行该代码,它会总是返回你的主要捆绑。但是,如果该类包含在不同的库或框架中,它将返回包含它的包。

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

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