ProtobufKit

codecov License: MIT

ProtobufKit 是一个轻量级1swift-protobuf 替代方案,用于在 Swift 中处理 Protocol Buffers 序列化技术。

概述

ProtobufKit 是一个 跨平台 的 Swift 包,支持 Darwin 平台(没有操作系统版本限制)和 Linux。2

工作流程 CI 状态
兼容性测试 Compatibility tests
macOS 单元测试 macOS
iOS 单元测试 iOS
Ubuntu 22.04 单元测试 Ubuntu

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 的用法相同。

但是,我们在这里使用 ProtobufTagUInt 来定义字段编号,而不是使用 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

相关项目

Star 历史

Star History Chart

脚注

  1. 在 macOS + Build for profiling 选项下,ProtobufKit 的 ProtobufKit.o 为 142KB,而 swift-protobuf 的 SwiftProtobuf.o 为 5.7MB

  2. 未来将添加 WASI 支持

  3. 与 SwiftUI 的兼容性可能会在未来的 SwiftUI 版本中中断