BlueSteel 0.2.0

BlueSteel 0.2.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2016年5月
SPM支持 SPM

Chandra 维护。



BlueSteel 0.2.0

  • 作者:
  • JP Simard 和 Samuel Giddins

Gilt Tech logo

BlueSteel

适用于 Swift 的 Avro 编码/解码库。

BlueSteel 是 Gilt Tech 的 Cleanroom 项目的一部分。

从未听说过 Avro 吗?

在继续阅读之前,请查阅 Avro 的官方文档

Swift 2.2 兼容性

此项目的 master 分支符合 Swift 2.2 标准,因此需要使用 Xcode 7.3 或更高版本才能编译。

将 BlueSteel 添加到您的项目中

为了使用它提供的 API,您需要将 BlueSteel 整合到您的项目中。您可以选择

一旦集成,只需将以下 import 语句添加到任何希望使用 BlueSteel 的 Swift 文件中

import BlueSteel

API 文档

有关使用 BlueSteel 的详细信息,请参阅API 文档

用法

由于 Avro 数据不是自描述的,我们需要在反序列化任何数据之前提供一个 Avro 架构。Schema 枚举是从 JSON 架构描述构建的,形式为字符串或 NSData。

import BlueSteel

let jsonSchema = "{ \"type\" : \"string\" }"
let schema = Schema(jsonSchema)

反序列化 Avro 数据

使用上面的 Schema,我们现在可以解码一些 Avro 二进制数据。

let rawBytes: [Byte] = [0x6, 0x66, 0x6f, 0x6f]
let avro = AvroValue(schema: schema, withBytes: rawBytes)

现在我们可以通过可选择的获取器从上面的 Avro 值获取 Swift 字符串。

if let avroString = avro.string {
    print(avroString) // Prints "foo"
}

序列化 Swift 数据

我们可以使用上面的相同 Schema 将 AvroValue 序列化为二进制。

if let serialized = avro.encode(schema) {
    print(serialized) // Prints [6, 102, 111, 111]
}

但我们是怎样将自己的 Swift 类型转换为 AvroValue 的呢?

通过遵守AvroValueConvertible协议!您只需使用一个函数扩展您的类型即可。

func toAvro() -> AvroValue

假设我们想要序列化一个带有以下方案的NSUUID

{
    "type" : "fixed",
    "name" : "UUID",
    "size" : 16
}

我们可以这样扩展NSUUID

extension NSUUID : AvroValueConvertible {
    public func toAvro() -> AvroValue {
        var uuidBytes: [Byte] = [Byte](count: 16, repeatedValue: 0)
        self.getUUIDBytes(&uuidBytes)
        return AvroValue.AvroFixedValue(uuidBytes)
    }
}

为了生成和序列化NSUUID,我们现在可以这样操作

let serialized: [Byte]? = NSUUID().toAvro().encode(uuidSchema)

嘿,看!现在我们有一个表示NSUUID的字节数组,它根据提供的固定方案序列化为Avro。好吧,上面这个例子可能有点过于简单。让我们看看一个更复杂的例子。假设我们有一个记录方案如下

{
    "type": "record", 
        "name": "test",
        "fields" : [
        {"name": "a", "type": "long"},
        {"name": "b", "type": "string"}
    ]
}

我们可以创建一个对应的Swift类型,可能看起来像这样

struct testStruct {
    var a: Int64 = 0
    var b: String = ""
}

要将testStruct转换为AvroValue,我们可以像这样扩展它

extension testStruct : AvroValueConvertible {
    func toAvro() -> AvroValue {
        return AvroValue.AvroRecordValue([
                "a" : self.a.toAvro(),
                "b" : self.b.toAvro()])
    }
}

您可能已经注意到上面我们调用过.Int64和String值的.toAvro()方法。我们不必自己定义这些,因为BlueSteel为Swift原始数据类型提供了AvroValueConvertible扩展。

因此,这基本上就是对BlueSteel的快速介绍。请注意,BlueSteel仍在早期开发阶段,可能会有重大变化。

关于

干净室项目始于一个实验,旨在用基于Swift的全新形式重新构思Gilt的iOS代码库,摒弃遗留代码。

从那时起,我们将干净室项目扩展到支持多个平台。我们的大部分代码库现在支持tvOS,除iOS外,我们的底层代码也适用于Mac OS X和watchOS。

干净室项目代码是Gilt on TV的基座,我们推出的tvOS应用程序,在新的Apple TV发布时被Apple展示(请参阅此链接)。随着时间的推移,我们将越来越多地将现有的Objective-C代码库替换为干净室实现。

与此同时,我们将关注Swift和Xcode的最新版本,并在过程中开源代码库的重要部分

贡献

BlueSteel正在积极开发中,我们欢迎您的贡献。

如果您想为这个或任何其他干净室项目仓库做出贡献,请阅读贡献指南

致谢

BlueSteel的API文档使用维护者是由Realm的项目jazzy生成的,由JP SimardSamuel E. Giddins维护。