2016-04-07 39 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:)方法)來提高代碼的可移植性。在創建動態框架時需要它。