轻量级 Swift 模块化工具和规范 – Lotusoot

codeday· 2019-09-23
本文来自 codeday ,作者 codeday

Lotusoot

Swift 路由和模块通信解耦工具和规范。 可以让模块间无耦合的调用服务、页面跳转。

安装

pod 'Lotusoot'

使用

1. 配置

  1. 在 Xcode 中点击工程,选择你的Target,点击Buid Phases,添加New Run Script Phase
  2. 将新建的Run Script拖拽至Compile Sources上方、Check Pods Manifest.lock下方,并填入以下脚本:

python ${PODS_ROOT}/Lotusoot/Lotusoot/Lotusoot.py ${SRC_ROOT} ${SRCROOT} Lotusoot # 参数1: 扫描路径 # 参数2: ${SRCROOT},Lotusoot.plist 输出地址 # 参数3: Lotusoot 命名后缀(可省略),省略将会导致脚本执行时间变长
  1. 编译你的工程,在 Finder 中可以看到,工程目录下生成了Lotusoot.plist,将其拖入工程中,不要选择 Copy items if needed。

Tip: 可以将Lotusoot.plist放入.gitignore文件避免不要的冲突。

2. 调用

  1. 服务调用
let lotus = s(AccountLotus.self) let accountModule: AccountLotus = LotusootCoordinator.lotusoot(lotus: lotus) as! AccountLotus
accountModule.login(username: "admin", password: "wow") { (error) in print(error ?? "")
}
  1. 短链注册
let error: NSError? = LotusootRouter.register(route: "newproj://account/login") { (lotusootURL) in accountModule.showLoginVC(username: "admin", password: "wow")
}
  1. 短链调用
let param: Dictionary = ["username" : "admin", "password" : "wow"] // 无回调  LotusootRouter.open(route: "newproj://account/login", params: param) // 有回调 LotusootRouter.open(route: "newproj://account/login", params: param).completion { (error) in print(error ?? "open success")
}
// ??不推荐的用法,用 ?pram0=xxx 这样的形式导致字符串散落在各处,不易管理。 // 但为了保证 Hybrid 项目中 H5 页面的正常跳转,提供了此种调用 LotusootRouter.open(url: "newproj://account/login?username=zhoulingyu").completion { (error) in print(error ?? "open success")
}

3. 注解与规范

Lotusoot的常规用法用例是:

  1. 建立共用模块,共用模块中定义了各个模块的Lotus,一个Lotus协议包含了一个模块的所有的能调用的方法的列表。举例如下:
public protocol AccountLotus { func login(username: String, password: String, complete: (Error?) -> Void) func register(username: String, password: String, complete: (Error?) -> Void) func email(username: String) -> String func showLoginVC(username: String, password: String)
}
  1. 各个模块中,包含了一个实现公共模块中对应的Lotus,称为Lotusoot。Lotusoot中具体实现了服务的逻辑,并在注解中表明了模块的命名空间-@NameSpace、Lotusoot-@Lotusoot“Lotus-@Lotus。举例如下:
// @NameSpace(TestAccountModule) // @Lotusoot(AccountLotusoot) // @Lotus(AccountLotus) class AccountLotusoot: NSObject, AccountLotus { func email(username: String) -> String { return OtherService.email(username: "zhoulingyu")
    } func login(username: String, password: String, complete: (Error?) -> Void) {
        LoginService.login(username: username, password: password, complete: complete)
    } func register(username: String, password: String, complete: (Error?) -> Void) {
        RegisterService.register(username: username, password: password, complete: complete)
    } func showLoginVC(username: String, password: String) { // 可以用你们喜欢的非耦合方式处理跳转  // 或者传入 rootvc  // 更好的方式是自己的非耦合 UI 跳转处理模块  print("show login view controller")
    }
}