原生zlib在iOS上为swift3充气/收缩

Tra*_*ggs 4 zlib ios swift swift3 swift-data

我希望能够膨胀/收缩Swift3数据结构.我找到了GzipSwift,但目前尚不清楚我是如何将其提供给我的iOS应用程序的.我试过的天真的事情包括:

  1. Data+Gzip.swift文件复制到我自己的项目中.然后抱怨import zlib所述文件的顶部.我认为这与相同源的zlib目录中的modulemap文件有关.但是我不确定在我自己的项目中重建那些内容或者如何重建这些内容.

  2. 从github克隆存储库,打开XCode并内置(基本上按下了运行按钮).然后尝试将其作为链接库或框架添加到我自己的项目中.我很确定只选择存储库的顶级目录不是我想做的,但我不知道还有什么可以尝试.

我已经找到了一些其他的代码,但它似乎过时并且相对于Swift2.

pbu*_*h25 13

我最近不得不将那个确切的库和文件添加到我的项目中,并且在经过大量的故障排除后终于让它工作了,所以让我带您完成这些步骤!

好的

1)在finder中转到项目的顶级目录,然后创建一个名为的新文件夹,Swiftzlib或者您想要导入的模块名称.(我们要做的是将zlib库添加为模块,因此将其视为导入Foundation或其他一些模块).为了澄清,此Swiftzlib目录最终将作为包含您*.xcodeproj*.xcworkspace文件的同一目录的子目录.

2)在您创建的文件夹中,制作两个文件.

  • INCLUDE.H
  • module.modulemap

3)在您的include.h文件中,输入以下内容:

#include<zlib.h>
Run Code Online (Sandbox Code Playgroud)

4)在您的module.modulemap文件中,输入以下内容:

module Swiftzlib [system] {
    header "include.h"
    export *
}
Run Code Online (Sandbox Code Playgroud)

其中Swiftzlib与您创建的文件夹的名称相同.

5)打开Xcode项目,然后选择目标

  • 5a)在Build Phases - > Link Binary with Libraries中,添加 libz.tbd
  • 5b)在Build Settings - > Swift Compiler - Search Paths中,$(PROJECT_DIR)/Swiftzlib非递归地添加到导入路径
  • 5c)在Build Settings - > Other Linker Flags中,添加-lz为标志

6)在Xcode中选择你的项目(可能没有必要,但我已经在我的项目中完成了它的工作)

  • 6a)在Build Settings - > Swift Compiler - Search Paths中,$(PROJECT_DIR)/Swiftzlib非递归地添加到导入路径

7)在Data+Gzip.swfit,添加import Swiftzlib到文件的顶部

8)清洁,建造和运行!


vau*_*all 11

使用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
}
Run Code Online (Sandbox Code Playgroud)