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

问题描述 投票:4回答:3

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

  1. Data+Gzip.swift文件复制到我自己的项目中。然后抱怨所述文件顶部的import zlib。我认为这与相同源的zlib目录中的modulemap文件有关。但是我不确定在我自己的项目中重建那些内容或者如何重建这些内容。
  2. 从github克隆存储库,打开XCode并内置(基本上按下了运行按钮)。然后尝试将其作为链接库或框架添加到我自己的项目中。我很确定只选择存储库的顶级目录不是我想做的,但我不知道还有什么可以尝试。

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

ios swift swift3 zlib swift-data
3个回答
13
投票

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

好的

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

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

  • INCLUDE.H
  • module.modulemap

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

#include<zlib.h>

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

module Swiftzlib [system] {
    header "include.h"
    export *
}

其中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)清洁,建造和运行!


3
投票

我在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头。


1
投票

使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.