SwiftHook
SwiftHook 是一个用 Swift 编写的简单且基于键的回调库。
查看生成的文档 vknabel.github.io/SwiftHook.
安装
SwiftHook 是一个纯 Swift 项目,支持 Swift Package Manager,Carthage 和 CocoaPods.
Swift Package Manager
import PackageDescription
let package = Package(
name: "YourPackage",
dependencies: [
.package(url: "https://github.com/vknabel/SwiftHook.git", from: "3.0.0")
]
)
Carthage
github "vknabel/SwiftHook" ~> 3.0.0
CocoaPods
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
pod 'SwiftHook', '~> 3.0.0'
HookEvent
一个HookEvent
是对原始值的封装,增加了额外的类型信息。这种类型信息为回调提供了编译时安全性。
/// example for DelegationHook
enum RepositoryPolicy: HookAction {
case nameAllowed
}
/// example for SerialHook
enum RepositoryAction: HookAction {
case nameChanged
}
extension HookEvent {
static let nameAllowed: HookEvent<RepositoryPolicy, String, Bool> = HookEvent(action: .nameAllowed)
static let nameChanged: HookEvent<RepositoryAction, String, ()> = HookEvent(action: .nameChanged)
}
DelegationHook
DelegationHook
只支持每个钩子键一个单独的回调,可以用小代理来替代。添加的闭包保存为保留状态。
var hook = DelegationHook<RepositoryPolicy>()
hook.respond(to: .nameAllowed) { string in
let len = count(string)
return len > 1 && len < 15
}
let allowed = hook.trigger(event: .nameAllowed, with: "SwiftHook")
.reduce(into: true, { $0 && $1 })
SerialHook
SerialHook
支持为每个HookEvent
提供多个闭包,但respond(to:, with:)
返回一个可选引用,需要存储在强引用中。
var hook = SerialHook<RepositoryAction>()
var updateObject = hook.respond(to: .nameChanged) { name in /*update title*/ }
var update2Object = hook.respond(to: .nameChanged) { name in /*update title in another place*/ }
hook.trigger(event: .nameChanged, with: "NewName")
updateObject = nil // removes the first name changed closure
许可
SwiftHook
根据MIT许可证发布。