一个用于处理各种归档和容器的(解)压缩算法和函数的框架。
SWCompression 是一个框架,包含一系列用于以下功能的函数:
它也适用于 Apple 平台、Linux 和 Windows。
所有功能都列在下表中。“TBD”表示该功能已计划但尚未实现(尚未)。
Deflate | BZip2 | LZMA/LZMA2 | LZ4 | |
---|---|---|---|---|
解压缩 | ✅ | ✅ | ✅ | ✅ |
压缩 | ✅ | ✅ | TBD | ✅ |
Zlib | GZip | XZ | ZIP | TAR | 7-Zip | |
---|---|---|---|---|---|---|
读取 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
写入 | ✅ | ✅ | TBD | TBD | ✅ | TBD |
此外,SWCompression 是完全使用 Swift 编写的。
可以使用 Swift Package Manager、CocoaPods 或 Carthage 将 SWCompression 集成到您的项目中。
要使用 SPM 安装,请将 SWCompression 添加到您的包依赖项中,并将其指定为您的目标的依赖项,例如:
import PackageDescription
let package = Package(
name: "PackageName",
dependencies: [
.package(name: "SWCompression", url: "https://github.com/tsolomko/SWCompression.git",
from: "4.8.0")
],
targets: [
.target(
name: "TargetName",
dependencies: ["SWCompression"]
)
]
)
您可以在 Swift Package Manager 的文档中找到更多详细信息。
将 pod 'SWCompression', '~> 4.8'
和 use_frameworks!
行添加到您的 Podfile。
要完成安装,请运行 pod install
。
如果您只需要框架的某些部分,则可以使用子 podspec 仅安装它们。 可用的子规范
对于 ZIP 和 7-Zip,最常用的压缩方法分别是:Deflate 和 LZMA/LZMA2。 因此,SWCompression/ZIP 子规范将 SWCompression/Deflate 子规范作为依赖项,而 SWCompression/LZMA 子规范是 SWCompression/SevenZip 的依赖项。
但是,这两种格式也支持其他压缩方法,其中一些方法已在 SWCompression 中实现。 对于 CocoaPods 配置,对于此类压缩方法,存在某种“可选依赖项”。
此上下文中的“可选依赖项”意味着,仅当在您的 Podfile 中明确指定并安装了相应的子规范时,SWCompression/ZIP 或 SWCompression/7-Zip 才支持压缩方法。
“可选依赖项”列表
注意: 如果您使用 Swift Package Manager 或 Carthage,您始终拥有所有功能(ZIP 和 7-Zip 构建时支持 Deflate、BZip2、LZMA/LZMA2 和 LZ4)。
将 github "tsolomko/SWCompression" ~> 4.8
添加到您的 Cartfile。
然后您应该运行 carthage update --use-xcframeworks
。 之后,将 SWCompression.xcframework
和 BitByteData.xcframework
文件从 Carthage/Build/
目录拖放到 Xcode 中目标的“General”选项卡的“Frameworks, Libraries, and Embedded Content”部分。
例如,如果您要解压缩“deflated”数据,只需使用
// let data = <Your compressed data>
let decompressedData = try? Deflate.decompress(data: data)
但是,您不太可能在任何归档文件之外遇到 deflated 数据。 因此,对于 GZip 归档文件,您应该使用
let decompressedData = try? GzipArchive.unarchive(archive: data)
大多数 SWCompression 函数都可能抛出错误,您有责任处理它们。 如果您查看可用错误类型及其案例的列表,您可能会因其数量而感到害怕。 但是,大多数情况(例如 XZError.wrongMagic
)都用于诊断目的。
因此,您只需要处理最常见的归档/算法错误类型即可。 例如
do {
// let data = <Your compressed data>
let decompressedData = try XZArchive.unarchive(archive: data)
} catch let error as XZError {
// <handle XZ related error here>
} catch let error {
// <handle all other errors here>
}
SWCompression 公共 API 的每个函数或类型都已记录在案。 该文档可以在其自己的 网站或通过稍短的链接找到:swcompression.tsolomko.me
有一个小型命令行程序“swcomp”,它包含在此存储库的“Sources/swcomp”中。 可以使用 Swift Package Manager 构建它(仅在 macOS 上可用)。
重要提示: “swcomp”命令行工具不适用于一般用途。
无论您发现错误、有建议、想法、反馈或其他内容,请在 GitHub 上创建一个 issue。 如果您有任何问题,可以在Discussions页面上提问。
如果是错误,如果您附加导致错误发生的文件(归档文件等),将特别有帮助。
如果您想贡献代码,请在 GitHub 上创建一个 pull request。
注意: 如果您正在考虑使用 SWCompression,请注意 Xcode 项目 (SWCompression.xcodeproj) 是手动创建的,您不应使用 swift package generate-xcodeproj
命令。
如果您想在计算机上运行测试,则在克隆存储库后,您需要执行几个额外的步骤
./utils.py download-bbd-macos
git submodule update --init --recursive
cd "Tests/Test Files"
cp gitattributes-copy .gitattributes
git lfs pull
git lfs checkout
第一个命令将下载 BitByteData 依赖项,这需要安装 Carthage。 剩余的命令将下载测试中使用的文件。 这些文件存储在单独的存储库中,使用 Git LFS。 这种复杂设置有两个原因。 首先,其中一些文件可能很大,如果 SWCompression 的用户在安装期间必须下载它们,那将是不幸的。 其次,Swift Package Manager 和当代版本的 Xcode 并非始终与启用 git-lfs 的存储库配合良好。 为了防止任何潜在的问题,测试文件已移至另一个存储库。
请注意,如果您想添加一种新的类型的测试文件,除了运行 git lfs track
之外,您还必须将此命令添加到“Tests/Test Files/.gitattributes”文件中的行复制到“Tests/Test Files/gitattributes-copy”文件中。 不要将“.gitattributes”文件提交到 git 历史记录中。 它被 git 忽略是有原因的!
另请注意 GitHub 上的 Git LFS 带宽配额:尝试限制使用 git lfs pull
下载 lfs 文件。 在 CI 中,我们使用一些缓存技术来帮助解决配额问题,因此,如果您要添加需要多个新测试文件的新测试,则应尝试将它们一起提交,以减少 CI 需要重新创建缓存的次数(重新创建缓存需要对所有测试文件执行 git lfs pull
)。
建议使用整个模块优化以获得最佳性能。 它们在 Release 构建配置中默认启用。
测试结果文档包含各种函数的基准测试结果。
首先,现有的用于处理压缩、归档和容器的解决方案存在某些缺点。 它们可能不支持特定的压缩算法或归档格式,并且它们都具有不同的 API,这有时可能会让用户感到困惑,尤其是在一个项目中混合使用不同的库时。 本项目尝试通过统一的 API 提供缺失的(有时是现有的)功能,该 API 易于使用和记忆。
其次,在某些情况下,拥有完全用 Swift 编写的压缩框架可能很重要,而无需依赖系统库或其他语言实现的解决方案。 此外,由于 SWCompression 完全用 Swift 编写,没有 Objective-C,因此它也可以在 Linux 和 Windows 上使用。