在 Swift 中,你可以调用
let bundle = NSBundle(forClass: self.dynamicType)
在任何类中并获取当前包。如果您 NSBundle.mainBundle()
这将无法获得正确的包,例如在运行单元测试时。
那么如何获取 Swift struct
的当前包?
最佳答案
最佳解决方案取决于您需要 bundle 的用途。
是否要查找仅存在于已知在您编写的代码运行时加载的特定应用程序、框架或扩展包中的资源?在这种情况下,您可能想使用 init(identifier:)
而不是动态查找定义特定类型的包。
当心“遵循类型”包查找。例如,如果框架类 Foo
使用 NSBundle(forClass: self.dynamicType)
加载资源,则 Foo
的子类由加载该框架的应用程序最终将查找应用程序包而不是框架包。
如果您确实需要对结构(或枚举)进行“遵循类型”包查找,一种可能有用的解决方法是将类定义为子类型:
struct Foo {
class Bar {}
static var fooBundle: NSBundle { return NSBundle(forClass: Foo.Bar.self) }
}
请注意,这里没有动态,因为不需要动态 — 每个 Foo
都来自相同的类型定义(因为结构无法继承),因此它的静态类型与其动态类型相匹配。
(不可否认,一个可以处理结构、枚举和协议(protocol)的 NSBundle(forType:)
可能会成为一个 nice feature request 。虽然我认为让它处理扩展和所有事情可能很棘手。 ..)
关于swift - 如何获取结构的 bundle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31316325/