Skip to content

Latest commit

 

History

History
138 lines (93 loc) · 4.75 KB

README_CN.md

File metadata and controls

138 lines (93 loc) · 4.75 KB

RaRouter

RaRouter

RaRouter 是一个面向协议的轻量级路由框架。

通过使用框架提供默认的类型,或者自定义路由,您可以快速搭建自己的路由组件,进而解耦自己的项目。

基本要求

  • 运行 iOS 10 及以上版本的设备。
  • 使用 Xcode 10 及以上版本编译。
  • Swift 5.0 以及以上版本。

安装

CocoaPods

pod 'RaRouter'

功能

  • 支持根据路由字符串执行对应的内容,或获得某些返回值。
  • 面向协议,提供非常高的自由度,供您自定义路由操作。
  • 新增/移除路由组件时,无需增加/减少任何注册相关的代码。
  • 可以通过封装,集中定义、隐藏路由字符串,减少硬编码带来的风险。
  • 可以通过封装,在执行路由时保持类型严格

使用

相关内容请参考 wiki: 快速入门

预览

下面的代码展示了使用 RaRouter 封装的模块:ModuleA。借助这段代码,您可以对 RaRouter 有一个初步的印象:

更多功能,以及完整的示例代码可以参考随仓库配套提供的 demo(在 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 这个伟大的开源组件。感觉作者的贡献!

License

RaRouterMIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。