😼
Sylvester
一个类型安全的、XPC支持的SourceKitten (SourceKit) 接口,附带一些糖。
寻找...
- 一个针对macOS的Floating Action Button?请查看Fab。
🛍️ . - 一个针对macOS的Bubble Text Field?请查看BubbleTextField
💬 . - 一个集成的基于Spotlight的macOS入门和帮助库?请查看Enlighten
💡 .
特性
- 类型安全,不再有 dictionaries 和
SourceKitRepresentable
- 可选的XPC服务,符合沙盒。
- 可继承的接口。
- 全面测试套件。
要求
- macOS 10.12+
模块
该Sylvester
框架有两种构建配置,它们在通知SourceKit
的方式上有所不同
Sylvester
— 从嵌入的应用或进程中直接通信。此模块不适合沙箱环境。SylvesterXPC
— 通过 XPC 服务进行通信。该模块提供权限分离、增强稳定性,且适合沙箱环境。
📌 注意: XPC 服务本身不能沙盒化(因为固有的依赖项:xcrun、xcodebuild、sourcekitd),并需要额外的 代码签名步骤。
安装
Sylvester
可以使用 Carthage 或 CocoaPods 进行安装。
CocoaPods
使用
📣 重要: 当前 XPC 服务(以及/或SylvesterXPC
模块)对 CocoaPods 安装不可用。
pod "Sylvester"
Carthage
使用github "chriszielinski/Sylvester"
依赖项
Sylvester
/ SylvesterXPC
依赖于以下框架/库,因此请确保它们也包含在 嵌入框架 阶段
SylvesterCommon.framework
SourceKittenFramework.framework
SWXMLHash.framework
Yams.framework
代码签名
如果您决定使用 SylvesterXPC
模块,您需要在其 SylvesterXPC.framework (即 嵌入框架 阶段之前)嵌入前添加一个 Run Script 阶段。请确保壳启动路径为 /bin/sh
(默认值)。然后对于 Carthage 安装,请执行存储库 脚本 目录中的 code_sign_carthage.sh
脚本。
"$SRCROOT/Carthage/Checkouts/Sylvester/Scripts/code_sign_carthage.sh"
对于其他安装,根据需要修改脚本的路径。
支持请求
请求 | 类 |
---|---|
代码完成 | SKCodeCompletion |
代码完成会话 | SKCodeCompletionSession |
文档信息 | SKDocInfo |
编辑器打开 | SKEditorOpen |
模块信息 | SKModule |
Swift 文档 | SKSwiftDocs |
语法映射 | SKSyntaxMap |
自定义YAML | SKYAMLRequest |
其他有趣的功能
子类化
大多数标准请求都是一些通用类的具体子类。你想有自己的子类?没问题,这可能做到。
SKSubstructure
, SKEntity
也称为SKBaseSubstructure
(或SKBaseEntity
),一个常见的罪魁祸首。
📌 注意:子类化SKBaseEntity
使用类似的语法。
final class BetterSubstructureSubclass: SKBaseSubstructure, SKFinalSubclass {
var iAmAnImportantProperty: String = "🚶♂️"
public override func decodeChildren(from container: DecodingContainer) throws -> [SKBaseSubstructure]? {
return try decodeChildren(BetterSubstructureSubclass.self, from: container)
}
/// The default iterator for `SKChildren` does a pre-order (NLR) depth-first search (DFS) traversal; however, if you want something else, for instance:
class FunctionSubstructureIterator<Substructure: BetterSubstructureSubclass>: SKPreOrderDFSIterator<Substructure> {
override func next() -> Substructure? {
guard let nextSubstructure = super.next()
else { return nil }
if nextSubstructure.isFunction {
return nextSubstructure
} else {
return next()
}
}
}
override class func iteratorClass<Substructure: BetterSubstructureSubclass>() -> SKPreOrderDFSIterator<Substructure>.Type {
return FunctionSubstructureIterator.self
}
}
SKEditorOpen
, SKSwiftDocs
这是一个使用上面声明的 BetterSubstructureSubclass
的 SKSwiftDocs
子类的例子
📌 注意:子类化SKEditorOpen
使用相同的语法,除了它从SKGenericEditorOpen
继承。
class BetterSwiftDocs: SKGenericSwiftDocs<BetterSubstructureSubclass> {
var mySuperCoolProperty: String = "😎"
}
SKModule
以下是一个使用上述声明的 BetterSwiftDocs
和 BetterSubstructureSubclass
类的 SKModule
子类的例子
class BetterModule: SKGenericModule<BetterSubstructureSubclass, BetterSwiftDocs> {}
文档
您可以在此处探索文档。
// 待办
- 添加对其他请求的支持。
社区
- 发现了一个错误?打开一个问题。
- 有什么功能想法?
打开一个问题。完成后自己做 & PR😅 (或者你可以打开一个🙄 ). - 想要贡献吗?提交一个 Pull Request。
贡献者
- Chris Zielinski — 创始作者。
框架和库
Sylvester
依赖于 Swift 社区的出色贡献,尤其是
- jpsim/SourceKitten — 一个可爱的小框架和命令行工具,用于与 SourceKit 交互。
- macmade/AtomicKit — Swift 中简单的并发解决方案。
- groue/GRMustache.swift — Swift 中的灵活 Mustache 模板。
- realm/jazzy — 专为 Swift 和 Objective-C 打造的充满灵魂的文档。
- realm/SwiftLint — 一款强制执行 Swift 风格和约定的工具。
许可证
Sylvester
可在 MIT 许可证下使用,更多信息请参阅 LICENSE 文件。