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?
答案 0 :(得分:3)
这将返回包含TestClass
类的包:
NSBundle(forClass: TestClass.self)
虽然这会返回应用程序的主要包:
NSBundle.mainBundle()
如果您从应用程序代码执行此代码,它将始终返回您的主包。但是如果该类包含在不同的库或框架中,它将返回包含它的包。
例如,CocoaPods中的所有Swift库都使用动态框架集成,并且它们部署在主bundle内的不同bundle中。因此,所有框架都必须使用嵌入式捆绑包来访问其资源。
我建议使用第一种方法(NSBundle(forClass:)
方法)来提高代码的可移植性。在创建动态框架时需要它。