Tests测试 | ✓ |
Lang语言 | SwiftSwift |
许可证 | MIT |
Released最新发布 | 2017年6月 |
SwiftSwift 版本 | 3.1 |
SPM支持 SPM | ✓ |
由 Jakob Jensen 维护。
Waffle 是一个非常简单的依赖容器。Waffle 不会尝试做太多,它将满足您 80 至 100% 的需求,并允许您扩展 Waffle 以满足所有需求。
假设您有两个以下数据源。
struct UserDataSource {
let name:String
}
struct RestDataSource {
let userDataSource:UserDataSource
func sayHi() {
print("Hi, \(userDataSource.name)")
}
}
首先,创建一个构建器,将所有依赖项添加到其中,并构建您的 Waffle
,它将包含所有这些依赖项。
let userDataSource = UserDataSource(name:"Mr. Example")
let restDataSource = RestDataSource(userDataSource: userDataSource)
let waffle = Waffle.Builder()
.add(userDataSource)
.add(restDataSource)
.build()
然后将 waffle
传递给具有依赖项的任何类,您可以像以下几行那样检索其依赖项。
let restDataSource = try! waffle.get(RestDataSource.self)
restDataSource.sayHi() // prints "Hi, Mr. Example"
这意味着您可以有如下示例中的构造函数。
class RestDependentViewController : UIViewController {
private unowned let restDataSource: RestDataSource
init(waffle:Waffle) {
restDataSource = try! waffle.get(RestDataSource.self)
}
// ...
}
简单而美丽,不是吗?
使用泛型时可能存在潜在问题,但别担心,也有简单的解决方法。以下是一个泛型可能成为问题的例子。
let cache = NSCache<AnyObject, AnyObject>()
let waffle = Waffle.Builder()
.add(NSCache<NSString, AnyObject>())
.add(cache)
.build()
// NOTE: this next line fails
let resolvedCache = try! waffle.get(NSCache<AnyObject, AnyObject>.self) // throws .multipleFound
它失败的原因是添加到 waffle
中的两个 NSCache
的 Type
都是简单的 NSCache
,但例如 NSCache<AnyObject, AnyObject>
。
解决方案很简单,您只需创建一个命名类即可。以下是如何解决这个问题泛型问题的示例。
class NamedCache : NSCache<AnyObject, AnyObject> { }
let cache = NamedCache()
let waffle = Waffle.Builder()
.add(NSCache<NSString, AnyObject>())
.add(cache)
.build()
let resolvedCache = try! waffle.get(NamedCache.self) // this does not throw an error