Swift 路由和模块通信解耦工具
采用target-action与Protocol结合的方式来实现的组件化路由中间件
- 支持使用字符串类名创建对象
- 支持使用字符串类名创建控制器并实现跳转
- 通过Protocol来规范对象的初始化方法和调用方法
- 组件间无耦合的调用服务,只需知道目标VC的类名和module名称
在 Xcode 的菜单栏中选择 File > Swift Packages > Add Pacakage Dependency
,然后在搜索栏输入
https://github.com/sjzuo/SwiftRouter
,即可完成集成
-
必须为NSObject的子类,纯Swift类不支持
-
想用此路由实现解耦的类,必须实现RouterProtocol协议
public protocol RouterProtocol: AnyObject {
/// 创建对象,为使用Router做准备
/// - Parameter params: 初始化时,需要用到的参数
/// - Returns: 返回创建的RouterProtocol对象
@discardableResult
static func createInstance(params: [String : Any]?) -> RouterProtocol
/// RouterProtocol调用static方法
/// - Parameters:
/// - type: 可以根据type判断需要跳转哪一个static方法
/// - params: static方法所需参数
/// - Returns: 静态方法返回的参数
@discardableResult
static func staticAction(type: Any?, params: [String : Any]?) -> Any?
/// RouterProtocol调用对象方法
/// - Parameters:
/// - type: 可以根据type判断需要调用的哪一个对象方法
/// - params: 对象方法所需参数
/// - Returns: 对象方法返回的参数
@discardableResult
func objectAction(type: Any?, params: [String : Any]?) -> Any?
}
初始化对象
Router.shared.createObject("SecondViewController", moduleName: "RouteDemo", params: ["bgColor" : UIColor.red])
初始化控制器
// 判断对象是否为控制器,是的话就返回
Router.shared.createController("SecondViewController", moduleName: "RouteDemo", params: ["bgColor" : UIColor.red])
Router.shared.push("SecondViewController", moduleName: "RouteDemo", from: self, params: ["bgColor" : UIColor.red], animation: true)
Router.shared.present("PresentController", moduleName: "RouteDemo", from: self, params: nil, isNavigation: true, animation: true) {}
调用对象方法
if let viewController = Router.shared.createObject("SecondViewController") {
// 已经知道对象,可以不用Router,直接调用objectAction方法
// 例如:viewController.objectAction(type: nil, params: nil)
// 使用Router调用对象方法
if let titleStr = Router.shared.objectAction(object: viewController) as? String {
debugPrint(titleStr)
}
}
调用静态方法
Router.shared.staticAction("SecondViewController", moduleName: nil, type: nil, params: nil)