SortingHat 0.2.3

SortingHat 0.2.3

Shao 维护。



SortingHat

Build Status Version License Platform

SortingHat 是一个纯 Swift 的路由库。提供通用的 URL 调用方案和枚举传参的内部调用方案。

特性

  • 通过协议声明式的路由规则定义,方便使用
  • 安全可靠的内部调用方式,参数变更引发的错误将在编译阶段暴露,让您放心
  • 代码自动生成,无需手动注册,贴心设计

示例

  1. 定义路由节点
extension DetailViewController: URLRoutable {
    static var urlPattern: String {
        return "x://detail/:id"
    }
    struct Parameters: ParametersDecodable {
        // This is a type wrapper like Box<Int>: Decodable
        let id: ValueType.Int
    }
    static func constructViewController(params: Parameters) -> UIViewController? {
        let vc = DetailViewController()
        vc.title = String(params.id.value)
        return vc
    }
}
  1. 注册路由
// 注册ViewController节点
SortingHat.register(node: RouteNode<DetailViewController>())

// 注册Handler节点
SortingHat.register(url: "x://handler/:target/:action") { (params) -> String? in
    guard let target = params["target"] as? String,
        let action = params["action"] as? String
        let content = params["content"] as? String
        else { return nil }
    return "target: \(target)\naction: \(action)\ncontent:\(content)"
}
  1. 模块中枢 中添加路由节点(以下代码将自动生成 将来
extension ModuleCenter {
    enum Demo {
        case detail(title: String)
        case list(title: String, id: String)
    }
}
extension ModuleCenter.Demo: RouteTargetType {
    var node: RouteNodeType {
        switch self {
        case .detail: return RouteNode<DetailViewController>()
        case .list: return RouteNode<ListViewController>()
        }
    }
}
  1. 业务场景中使用
// URL调用方式
SortingHat.show(targetUrl: "x://detail?title=SortingHat.detail", from: self)

// 内部Target调用方式
SortingHat.show(target: ModuleCenter.Demo.list(title: "SortingHat.list", id: "BJ2019"), from: self)

// Handler for url
SortingHat.handle(url: "x://handler/storyTarget/commentAction?content=Hello,SortingHat")

// ViewController之间的传值问题. Handle message between viewControllers.
SortingHat.show(targetUrl: "x://detail?title=MessageSender", from: self) { message in
    guard if let content = message as? String else { return print("Not match the message.") }
    print("Content is \(content)")
}

路线图

  • 单元测试。
  • 在模块加载点注册 URL。
  • 为子模块自动生成扩展代码。
  • 文档。

安装

pod 'SortingHat', '~> 0.2'

协议

SortingHat 在 MIT 协议下可用。有关更多信息,请参阅 LICENSE 文件。