Waffle 1.0.5

Waffle 1.0.5

Tests测试
Lang语言 SwiftSwift
许可证 MIT
Released最新发布2017年6月
SwiftSwift 版本3.1
SPM支持 SPM

Jakob Jensen 维护。



Waffle 1.0.5

  • 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 中的两个 NSCacheType 都是简单的 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

常见问题解答

你为什么要制作 Waffle?
我不理解为什么所有的其他依赖管理器/注入器都很大,所以我感觉像要制作一个替代解决方案。
为什么它叫 'Waffle'?
华夫饼很美味,我现在想吃一个。