下文,写的是 Swift 依赖
OC 库,没有命名空间
组件化的要点,在于约定
个人觉得
例如,URL 路由的注册,就是把约定的信息,传过去。作为服务。
Lotusoot 包含服务调用,短链的注册与调用
下面着重讲服务调用,短链略
a, 场景,
project 有两个依赖 A (协议) 和 B (协议的实现者,提供服务)
project 引用 A,知道了协议信息
project 不引用 B , project 对 B 一无所知
- 这样 project 把 B 去掉,编译的更快
B 依赖 A, 引用 A, 实现 A 的协议,提供服务
b, 调用服务
// 拿到 key
let lotus = s(AccountLotus.self)
// kv 取得提供服务的实例
let accountModule: AccountLotus = LotusootCoordinator.lotusoot(lotus: lotus) as! AccountLotus
// 调用服务
accountModule.login(username: "zhoulingyu", password: "wow") { (error) in
print(error ?? "1234")
}
-
第三步,调用服务很简单
-
第 2 步,挺精彩,充分使用了 Swift 编译时的静态特性
协议的方法,编译时确定了
需要几个参数,啥类型的,一般都可以显式使用
不用看到一个参数字典,啊,这是啥
// 第 2 步。从下面取
// 键值对,值是提供服务的对象
var lotusootMap: Dictionary = Dictionary<String, Any>()
- 第 1 步, 拿到键
这里把协议名,作为 key
// 使用泛型,取其描述
// 协议,转协议名
public extension String {
init<Subject>(_ instance: Subject) {
self.init(describing: instance)
}
}
/// 通过 Subject 快速获取字符串
public func s<Subject>(_ instance: Subject) -> String {
return String(instance)
}
c, 注册服务
1, Project 没有 import B ( 提供服务 ), 怎么使用 B 的功能?
public static func registerAll(serviceMap: Dictionary<String, String>) {
for (lotus, lotusootName) in serviceMap {
// lotus, 协议名
// lotusootName, 包名.类名
let classStringName = lotusootName
// 反射,产生类