RaRouter
RaRouter
是一个轻量级的协议导向路由框架。
通过使用此框架提供默认类型或自定义路由,您可以快速构建自己的路由组件,然后解耦您的项目。
先决条件
- iOS 10 或更高版本.
- 需要 Xcode 10.0 或更高版本。
- 需要 Swift 5.0 或更高版本。
安装
CocoaPods
pod 'RaRouter'
特性
- 支持根据 路由字符串 执行对应内容,或获取一些返回值。
- 协议导向,为您提供高度自定义路由操作的自由度。
- 在添加/移除路由组件时,无需 添加/移除任何注册相关代码。
- 通过封装,统一定义和隐藏 路由字符串,以减少硬编码的风险。
- 在通过封装进行路由时,您可以保持类型严格。
使用
有关相关内容,请参阅wiki: 快速入门。
预览
以下代码演示了使用RaRouter
封装的模块:ModuleA
。
通过此代码,您可以初步感受RaRouter
关于更多功能和完整示例代码,请参阅仓库中提供的演示代码(位于
Examples
目录下)。
// In the `Interface.swift` file of the router project
public enum ModuleA: ModuleRouter {
public struct Factory: RouterFactory {
public init() {}
}
public enum Table: String, RouterTable {
case create = "RaRouter://ModuleA/create"
case doSomething = "RaRouter://ModuleA/do/something"
case calculateFrame = "RaRouter://ModuleA/calculate/frame"
}
}
public extension Router where Module == ModuleA {
static func doSomething(start: Date, end: Date) -> DoResult {
return Router.do(.doSomething, param: (start, end))
}
static func calculateFrame(with screenWidth: CGFloat) -> GetResult<CGRect> {
return Router.get(of: CGRect.self, from: .calculateFrame, param: screenWidth)
}
static func create() -> ViewControllerResult {
return Router.viewController(from: .create)
}
}
// In the `Register.swift` file of the core project
extension Test.Factory: FactoryMediator {
public var source: RouterFactory { RealFactory() }
private struct RealFactory: RouterFactory {
lazy var doHandlerFactories: [String : DoHandlerFactory]? = [
ModuleA.Table.doSomething.rawValue : { (url, value) -> DoResult in
guard let param = value as? (start: Date, end: Date) else {
return .failure(.parameterError(url: url, parameter: value))
}
print("We are doing these things from \(param.start) to \(param.end)")
return .success(())
}
]
lazy var getHandlerFactories: [String : GetHandlerFactory]? = [
ModuleA.Table.calculateFrame.rawValue : { (url, value) -> GetResult<AnyResult> in
guard let screenWidth = value as? CGFloat else {
return .failure(.parameterError(url: url, parameter: value))
}
return .success(CGRect(x: 0, y: 0, width: screenWidth * 0.25, height: screenWidth))
}
]
lazy var viewControllerHandlerFactories: [String : ViewControllerHandlerFactory]? = [
ModuleA.Table.create.rawValue : { (url, value) -> ViewControllerResult in
return .success(UIViewController())
}
]
}
}
// Execute
_ = Router<ModuleA>.doSomething(start: Date(), end: Date())
let frame = Router<ModuleA>.calculateFrame(with: UIScreen.main.bounds.width).get(default: .zero)
if case .success(let controller) = Router<ModuleA>.create() {
navigationController?.pushViewController(controller, animated: true)
}
参考
在开发过程中,我参考了优秀的开源组件 URLNavigator,感受到了作者的贡献!
许可
RaRouter
在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。