Shepherd
Shepherd是一个路由实现,有助于引导您的应用程序中的路由。
let tabsRouter = Router()
let firstTabRouter = Router()
let secondTabRouter = Router()
tabsRouter.add(child: firstTabRouter)
tabsRouter.add(child: secondTabRouter)
tabsRouter.addHandlerForPaths(ofType: String.self) { path, completionHandler in
if path == "show-about-screen" {
// Select tab
}
completionHandler(false)
}
secondTabRouter.addHandlerForPaths(ofType: String.self) { path, completionHandler in
if path == "show-about-screen" {
// Push about screen
completionHandler(true)
} else {
completionHandler(false)
}
}
firstTabRouter.handle(path: "show-about-screen")
文档
Shepherd完全文档化,并提供了代码级文档。在线文档是从源代码中生成的,因此它与每个版本都是最新的,但可能与master
中的代码不同。
使用概述
Shepherd有2种主要类型以帮助路由:Router
和PathHandler
。PathHandler
是一个具有单个要求的协议
public protocol PathHandler: class {
func handle<Path>(path: Path, completionHandler: ((PathHandler?) -> Void)?)
}
Router
是一个open class
,它允许创建一个路径处理器的树,并实现了PathHandler
协议。
open class Router: PathHandler {
public typealias CompletionHandler = (_ routeHandler: Router?) -> Void
public internal(set) weak var parent: Router?
public init()
public func handle<Path>(path: Path, completionHandler: ((PathHandler?) -> Void)?)
open func handle<Path>(path: Path, ignoring: [Router] = [], completionHandler: ((PathHandler?) -> Void)? = nil)
open func add(child pathHandler: PathHandler, priority: Priority = .medium)
open func remove(child pathHandler: PathHandler)
当在优先级顺序中调用handle
函数时,Router
将查询子节点。如果没有子节点处理该路径,则将传递给父节点(如果存在)。
子节点可以查询自己的子节点,因此可以创建处理器树。例如,使用以下树
(A)
/ \
(B) (C)
/ | \ \
(D)(E)(F) (G)
如果查询处理器(B)并且(C)可以处理该路径,则处理器的调用顺序如下
- D
- E
- F
- A
- C
这将导致返回(C)。
path
参数
path
参数的类型没有任何限制。当使用方便的 addHandlerForPaths(ofType:priority:pathHandler:)
或 addPathHandler(priority:pathHandler:)
函数时,提供的闭包只有在路径与提供的闭包能够接受相同的类型时才会被调用,但父路由仍然将尝试处理所有路由。
这种灵活性可能会使得决定使用哪种类型变得困难。虽然最终的决定权在开发者手中,以下是一些有用的类型示例
URL
- 如果存在应用程序的网页版本,这将使得支持通用链接更加容易。
NSSystemActivity
- 这可以在支持某些系统功能时有所帮助,例如,接力、Siri 和 Spotlight。
- 自定义枚举
- 枚举可以使处理路由变得更加容易。例如,一个
SettingsRoute
枚举可以辅助自动完成和代码安全。
- 枚举可以使处理路由变得更加容易。例如,一个
测试和持续集成
Shepherd 拥有一个完整的测试套件,它作为拉取请求的一部分运行。所有测试都必须通过才能合并拉取请求。
代码覆盖率被收集并报告给 Codecov。代码库有 100% 的覆盖率。除非不击中未覆盖的行是永远不会击中的并且是对于类型安全所需的,或者未由 Swift 跟踪,例如 deinit
函数,否则不会接受降低覆盖率的 PR。
安装
SwiftPM
要使用 SwiftPM 安装,请将包添加到依赖部分,并将其作为目标的依赖项
let package = Package(
...
dependencies: [
.package(url: "https://github.com/JosephDuffy/Shepherd.git", from: "0.1.0"),
],
targets: [
.target(name: "MyApp", dependencies: ["Shepherd"]),
],
...
)
Carthage
通过Carthage安装,请将以下内容添加到您的Cartfile
文件中。
github "JosephDuffy/Shepherd"
运行carthage update Shepherd
命令来构建框架,然后将构建好的框架文件拖拽到您的Xcode项目中。Shepherd提供了预编译的二进制文件,这可能会引起某些关于符号的问题。关于这些问题的更多信息,如果存在问题,请使用--no-use-binaries
标志。
请记住将Shepherd添加到您的Carthage构建阶段。
$(SRCROOT)/Carthage/Build/iOS/Shepherd.framework
并
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Shepherd.framework
CocoaPods
通过CocoaPods安装,请将以下内容添加到您的Podfile文件中。
pod 'Shepherd'
然后运行pod install
命令。
许可证
本项目遵循MIT许可协议。查看LICENSE文件以获取完整的许可信息。