iOS上swift3的本机zlib充气/放气

iOS上swift3的本机zlib充气/放气,ios,swift,swift3,zlib,swift-data,Ios,Swift,Swift3,Zlib,Swift Data,我希望能够对Swift3数据结构进行充气/放气。我找到了,但不清楚我是如何在iOS应用程序中使用它的。我尝试过的天真的事情包括: 将数据+Gzip.swift文件复制到我自己的项目中。然后,这会抱怨所述文件顶部的导入zlib。我认为这与相同来源的zlib目录中的modulemap文件有关。但我不确定在我自己的项目中如何重新创建它们 从github克隆存储库,打开XCode并内置(基本上按了run按钮)。然后尝试将其作为链接库或框架添加到我自己的项目中。我很确定,仅仅选择存储库的顶级目录并不是我想

我希望能够对Swift3数据结构进行充气/放气。我找到了,但不清楚我是如何在iOS应用程序中使用它的。我尝试过的天真的事情包括:

  • 数据+Gzip.swift
    文件复制到我自己的项目中。然后,这会抱怨所述文件顶部的
    导入zlib
    。我认为这与相同来源的zlib目录中的modulemap文件有关。但我不确定在我自己的项目中如何重新创建它们

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


  • 我在那里找到了一些其他代码,但它似乎过时了,并且与Swift2相关。

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

    好的

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

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

    • 包括
    • module.modulemap
    3) 在
    include.h
    文件中,输入以下内容:

    #include<zlib.h>
    
    module Swiftzlib [system] {
        header "include.h"
        export *
    }
    
    其中Swiftzlib与您创建的文件夹的名称相同

    5) 打开您的Xcode项目,并选择您的目标

    • 5a)在构建阶段->将二进制文件与库链接,添加
      libz.tbd
    • 5b)在构建设置->Swift编译器-搜索路径中,将
      $(PROJECT_DIR)/Swiftzlib
      非递归地添加到导入路径中
    • 5c)在构建设置->其他链接器标志中,添加
      -lz
      作为标志
    6) 在Xcode中选择您的项目(可能没有必要,但我已经在我的项目中完成了,并且可以正常工作)

    • 6a)在构建设置->Swift编译器-搜索路径中,将
      $(PROJECT\u DIR)/Swiftzlib
      非递归地添加到导入路径中
    7) 在
    Data+Gzip.swfit
    中,将
    import Swiftzlib
    添加到文件顶部


    8) 清洁、建造和运行

    我在苹果原生libcompression框架上维护了一个小型Swift 3+包装器,位于:

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

    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
    }
    
    <代码>导入基础 输入压缩 func解压(u数据:数据)->字符串{ 让尺寸=8_000_000 let buffer=unsafemeutablepointer.allocate(容量:大小) 让result=data.subdata(in:2..Wow!谢谢你的详细答复。我明天会尝试一下,希望到时候能接受答案。遗憾的是,我仍然会遇到“没有这样的模块Swiftzlib”错误:(确保指向库的路径正确,这是至关重要的。明白了!我的误解是什么构成了“项目的顶级目录”.事实上,这里可能有一个灯泡亮了…XCode倾向于将项目中的所有.swift源放在与上面的目录同名的目录中。这是因为它表示项目的内在模块吗?您可以将模块放在项目文件结构中的任何位置,您只需选择导入部分的正确路径。至于你的第二个问题…我不确定。Xcode可以做到这一点,即使是对于obj-c项目,所以它可能只是文件结构。我非常确定swift文件是否在同一名称空间中(如项目名称中)编译器无需导入就可以看到它们。您从不将AppName作为应用程序中的模块导入。请从此处的链接添加详细信息。@the_Androctonus
    size
    是缓冲区的分配大小,即保留要使用的字节数。如果您不知道要输入多少字节,通常可以输入一个大数字我花了几天的时间才找到同样的答案…谢谢你的回答。我会把我的头发弄出来的!谢谢@vauxhall!你救了我的命!几天后我终于找到了这个答案。我想知道为什么?