ByteBackpacker
ByteBackpacker 是一个纯 Swift 编写的实用工具,用于将值类型打包到一个
Byte
数组中,然后再反解包。
此外,还有一个 Data
(以前称为 NSData
)扩展,可以将 Data
对象转换为 Byte
数组。
¹ Byte
是 typealias
的别名为 UInt8
。
目录
安装
您有三个选择
-
将
ByteBackpacker.swift
文件(包含ByteBackpacker
类)复制到您的项目中。 -
使用 Swift 包管理器
import PackageDescription let package = Package( name: "TestImport", dependencies: [ .Package(url: "https://github.com/michaeldorner/ByteBackpacker.git") ] )
-
使用 CocoaPods:`pod 'ByteBackpacker'`
尽管它也可以以相同的方式在 Objective-C 中使用,但我主要是为 Swift 项目考虑的。对于 Objective-C 用户来说,最简单的方式是内嵌 `ByteBackpacker.framework`。当然,Swift 用户也可以这样做,但实际上我没有看到任何优势。
使用方法
正确使用很重要:ByteBackpacker仅支持值类型(例如数字、结构体等),但不支持引用类型(例如类)!有关更多信息,请参阅讨论。
所有示例均可在ByteBackpackerPlayground.playground
中运行。让我们看看一些一般用途案例
从《Double》到《[Byte]》
let aDouble: Double = 1.0
let aByteArray: [Byte] = ByteBackpacker.pack(aDouble)
从《[Byte]》到《Double》
let option_1: Double = ByteBackpacker.unpack(aByteArray)
let option_2 = ByteBackpacker.unpack(aByteArray) as Double
let option_3 = ByteBackpacker.unpack(aByteArray, toType: Double.self)
从《Double》到《Data》到《[Byte]》到《Double》
var anotherDouble: Double = 2.0
let data = Data(bytes: &anotherDouble, count: MemoryLayout<Double>.size)
var byteArrayFromNSData = data.toByteArray()
let doubleFromByteArray = ByteBackpacker.unpack(byteArrayFromNSData, toType: Double.self)
从《[Byte]》到《Data》
let anotherByteArray: [Byte] = [0, 0, 0, 0, 0, 0, 8, 64]
let dataFromByteArray = Data(bytes: anotherByteArray)
API
Byte
是对 UInt8
的 typealias
。
ByteOrder
是一个代表小端和长端的枚举类型,参见:小端和长端。此外,您还可以要求平台返回系统的本地字节序:ByteOrder.nativeByteOrder
。默认情况下,使用.nativeByteOrder
进行打包和解包。
将值类型打包到[Byte]
中,使用
公开类函数 pack<T: Any>( _ value: T, byteOrder: ByteOrder = .nativeByteOrder) -> [Byte]
将一个[Byte]
解包到值类型,可以使用以下方式:
公开类函数 unpack<T: Any>(_ valueByteArray: [Byte], byteOrder: ByteOrder = .nativeByteOrder) -> T
或者如果您想使用类型推断
公开类函数 unpack<T: Any>(_ valueByteArray: [Byte], toType type: T.Type, byteOrder: ByteOrder = .nativeByteOrder) -> T
讨论
泛型
在Swift的泛型中无法指定值类型(参见这里在Stackoverflow上的讨论)。如果能像这样指定方法:func (un)pack<T: Any where T: ~AnyClass>(...)
,编译器就能检查值类型。目前ByteBackpacker使用assert(...)
来确保值类型。
一个未解决的问题是如何测试这个值类型检查的assert(...)
。
我非常希望改进这个项目。告诉我您的想法,可以在GitHub上,通过电子邮件,或在codereview.stackexchange.com。
贡献
待办事项
- 找到一种解决方案来确保
T
是一个值类型,而不是一个引用类型 - 为源代码添加文档以实现良好的Xcode集成
- 找到测试
assert()
的解决方案
致谢
在此特别感谢
- Martin R 在 codereview.stackexchange.com 提出建议
- iCodist 对 Swift 3 和 Xcode 8 的更新
- vaggos666 对 Swift 4 的评论
版本
(不幸/幸运的是) Swift 的开发正在进行中。这使得 ByteBackpacker 需要做出较大的更改。以下表格显示了兼容性。
Swift 版本 | 2.0 | 3.0 | 4.0 及以上 |
---|---|---|---|
ByteBackpacker 1.0 | ✓ | ✗ | ✗ |
ByteBackpacker 1.1 | ✗ | ✓ | ✗ |
ByteBackpacker 1.2 及以上 | ✗ | ✓ | ✓ |
希望 API 现在已经稳定。
许可协议
ByteBackpacker 以 MIT 许可协议发布。有关更多信息,请参阅 LICENSE 文件。