SortingHat
是一个纯Swift的路由库。提供普适的URL
调用方案和枚举传参的内部调用方案。
- 协议声明式的路由规则定义,省心
- 安全可靠的内部调用方式,参数变更引发的错误会在编译阶段暴露,放心
- 代码自动生成,无需手动注册,贴心
- 定义路由节点
extension DetailViewController: URLRoutable {
static var urlPattern: String {
return "/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
}
}
- 路由注册
// 注册ViewController节点
SortingHat.register(node: RouteNode<DetailViewController>())
// 注册Handler节点
SortingHat.register(url: "/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)"
}
- 在
模块中枢
增开路由节点(以下代码可自动生成 In future)
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>()
}
}
}
- 业务场景使用
// URL调用方式
SortingHat.show(targetUrl: "/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: "/handler/storyTarget/commentAction?content=Hello,SortingHat")
// ViewController之间的传值问题. Handle message between viewControllers.
SortingHat.show(targetUrl: "/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)")
}
- Unit Test.
- Register URLs at module load point.
- Auto generate extension code for submodule.
- Documentation.
pod 'SortingHat', '~> 0.2'
SortingHat is available under the MIT license. See the LICENSE file for more info.