ProtobufKit 是一个轻量级1 的 swift-protobuf 替代方案,用于在 Swift 中处理 Protocol Buffers 序列化技术。
ProtobufKit 是一个 跨平台 的 Swift 包,支持 Darwin 平台(没有操作系统版本限制)和 Linux。2
工作流程 | CI 状态 |
---|---|
兼容性测试 | |
macOS 单元测试 | |
iOS 单元测试 | |
Ubuntu 22.04 单元测试 |
ProtobufKit 兼容3 最新的 SwiftUI 内部 Protobuf 实现,因此你可以使用它来解码 SwiftUI 的一些内部二进制数据 (例如,ArchivedView)。
ProtobufKit 的核心设计是 ProtobufMessage
,它类似于 Codable
并且易于自定义。
public protocol ProtobufEncodableMessage {
func encode(to encoder: inout ProtobufEncoder) throws
}
public protocol ProtobufDecodableMessage {
init(from decoder: inout ProtobufDecoder) throws
}
public typealias ProtobufMessage = ProtobufDecodableMessage & ProtobufEncodableMessage
你还可以通过使你的消息类型符合 CodaleByProtobuf
或使用 ProtobufCodable
属性包装器注释你的消息实例,将其与 Codable
一起使用。
在你的 Package.swift
文件中,将以下依赖项添加到你的 dependencies
参数中
.package(url: "https://github.com/OpenSwiftUIProject/ProtobufKit.git", from: "0.1.0"),
然后将依赖项添加到你在清单中声明的任何目标中
.target(
name: "MyTarget",
dependencies: [
.product(name: "ProtobufKit", package: "ProtobufKit"),
]
),
要使类型符合 ProtobufMessage
,你需要实现 init(from:)
和 encode(to:)
方法,这与 Codable
的用法相同。
但是,我们在这里使用 ProtobufTag
或 UInt
来定义字段编号,而不是使用 CodingKeys
。
import ProtobufKit
struct SimpleMessage: ProtobufMessage {
let value: Bool
init(from decoder: inout ProtobufDecoder) throws {
while let field = try decoder.nextField() {
switch field.tag {
case 1:
value = try decoder.boolField(field)
return
default: try decoder.skipField(field)
}
}
value = false
}
func encode(to encoder: inout ProtobufEncoder) throws {
encoder.boolField(1, value)
}
}
请参阅 ProtobufKit 文档站点,以获取有关该库的更多详细信息。
ProtobufKit 没有像 Codable
那样内置的编译器支持,因此你必须自己编写编码和解码逻辑。
这可以通过未来的宏 API 改进,如下所示。
struct SimpleMessage: ProtobufMessage {
@Field(tag: 1, type: .bool)
var value: Bool
}
请参阅 LICENSE 文件 - MIT
在 macOS + Build for profiling 选项下,ProtobufKit 的 ProtobufKit.o 为 142KB,而 swift-protobuf 的 SwiftProtobuf.o 为 5.7MB ↩
未来将添加 WASI 支持 ↩
与 SwiftUI 的兼容性可能会在未来的 SwiftUI 版本中中断 ↩