测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布上次发布 | 2017年2月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Jakub Vano、Mark DiFranco、Yoichi Tagaya、Maxim Chipeev 维护。
SwinjectPropertyLoader 是 Swinject 的一个扩展,它可以从与您的应用程序或框架捆绑的资源中加载属性值。
Swinject 通过 Carthage 或 CocoaPods 提供。
属性是可以从与应用程序/框架捆绑的资源中加载的值。然后可以在容器中构建定义时使用这些属性。
支持两种类型的属性格式:
每种格式都支持该格式本身指定的类型。如果使用 JSON 格式,则支持以下基本类型:`Bool`、`Int`、`Double`、`String`、`Array` 和 `Dictionary`。对于 Plist,支持 Plist 所支持的所有类型,包括所有 JSON 类型、`NSDate` 和 `NSData`。
JSON 属性文件还支持注释,这允许您为您提供的属性键名称以外的属性提供更多上下文。例如
{
// Comment type 1
"foo": "bar",
/* Comment type 2 */
"baz": 100,
/**
Comment type 3
*/
"boo": 30.50
}
将属性加载到容器中就像这样简单
let container = Container()
// will load "properties.json" from the main app bundle
let loader = JsonPropertyLoader(bundle: .mainBundle(), name: "properties")
try! container.applyPropertyLoader(loader)
现在您可以将属性注入到容器中注册的定义中。
考虑以下定义
class Person {
var name: String!
var count: Int?
var team: String = ""
}
假设我们的 `properties.json` 文件包含以下内容
{
"name": "Mike",
"count": 100,
"team": "Giants"
}
然后我们可以使用以下方式注册此 Service 类型
container.register(Person.self) { r in
let person = Person()
person.name = r.property("name")
person.count = r.property("count")
person.team = r.property("team")!
}
这将解决这个人的属性
let person = container.resolve(Person.self)!
person.name // "Mike"
person.count // 100
person.team // "Giants"
属性对每个容器都是可用的。可以将多个属性加载器应用于单个容器。属性将按照它们应用于容器的顺序合并。例如,假设您有两个属性文件
{
"message": "hello from A",
"count": 10
}
并且
{
"message": "hello from B",
"timeout": 4
}
如果我们先应用属性文件 A,然后应用属性文件 B 到容器中,那么生成的属性键值对将是
message = "hello from B"
count = 10
timeout = 4
如您所见,message
属性已被覆盖。这只适用于第一级属性,这意味着Dictionary
和Array
不会被合并。例如
{
"items": [
"hello from A"
]
}
并且
{
"items": [
"hello from B"
]
}
items
的结果值会是:[ "来自 B 的问候" ]
SwinjectPropertyLoader最初由Mike Owens编写。
MIT许可证。有关详细信息,请参阅许可证文件。