我希望能够膨胀/收缩Swift3数据结构。我找到了GzipSwift,但目前尚不清楚我是如何将其提供给我的iOS应用程序的。我试过的天真的事情包括:
Data+Gzip.swift
文件复制到我自己的项目中。然后抱怨所述文件顶部的import zlib
。我认为这与相同源的zlib目录中的modulemap文件有关。但是我不确定在我自己的项目中重建那些内容或者如何重建这些内容。我已经找到了一些其他的代码,但它似乎过时了,相对于Swift2。
我最近不得不将那个确切的库和文件添加到我的项目中,经过大量的故障排除后终于让它工作了,所以让我带您完成这些步骤!
好的
1)在finder中转到项目的顶级目录,并创建一个名为Swiftzlib
的新文件夹或任何您想要导入的模块名称的文件夹。 (我们要做的是将zlib库添加为模块,因此将其视为导入Foundation或其他一些模块)。为了澄清,这个Swiftzlib
目录最终将作为包含*.xcodeproj
和*.xcworkspace
文件的同一目录的子目录。
2)在您创建的文件夹中,制作两个文件。
3)在include.h
文件中,输入以下内容:
#include<zlib.h>
4)在module.modulemap
文件中,输入以下内容:
module Swiftzlib [system] {
header "include.h"
export *
}
其中Swiftzlib与您创建的文件夹的名称相同。
5)打开Xcode项目,然后选择目标
libz.tbd
$(PROJECT_DIR)/Swiftzlib
非递归地添加到导入路径-lz
作为标志6)在Xcode中选择你的项目(可能没有必要,但我已在我的项目中完成它并且它有效)
$(PROJECT_DIR)/Swiftzlib
非递归地添加到导入路径7)在Data+Gzip.swfit
中,将import Swiftzlib
添加到文件的顶部
8)清洁,建造和运行!
我在Apples本机libcompression框架周围维护了一个小的Swift 3+包装器:
https://github.com/mw99/DataCompression
gzip的用法示例:
let data: Data! = "https://www.ietf.org/rfc/rfc1952.txt".data(using: .utf8)
let gzipped: Data! = data.zip()
let gunzipped: Data? = gzipped.unzip()
assert(data == gunzipped)
但如果你只对经典膨胀和放气感兴趣,你可以使用.inflate()
和.deflate()
方法代替。这将节省18个字节,因为不会添加gzip头。
使用Compression实现Swift 5。
花了几天时间才意识到我必须丢弃压缩数据的前2个字节。希望它可以帮助别人。
import Foundation
import Compression
func decompress(_ data: Data) -> String {
let size = 8_000_000
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: size)
let result = data.subdata(in: 2 ..< data.count).withUnsafeBytes ({
let read = compression_decode_buffer(buffer, size, $0.baseAddress!.bindMemory(to: UInt8.self, capacity: 1),
data.count - 2, nil, COMPRESSION_ZLIB)
return String(decoding: Data(bytes: buffer, count:read), as: UTF8.self)
}) as String
buffer.deallocate()
return result
}