iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 在Swift 3中提取Data对象的片段大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个60字节的数据流,如下所示

let myDataStream = Data(bytes: [24,163,209,194,255,1,184,230,37,208,140,201,6,64,7,98,108,117,...])

字节#1(索引0)表示第一个对象的长度,因此在这种情况下,第一个对象由前24个对象组成,包括字节#1

我尝试了很多方法,但我一直无法弄清楚

>如何将前24个字节提取到新的Data对象中
>#1完成后,如何从myDataStream中删除前24个字节.字节#25将再次具有下一个对象的大小

我最接近解决#1的是

let streamLength = Int(myDataStream[0])
let newStream = Data(bytes: myDataStream[0...streamLength])

但是我得到一个错误,说明无法使用Data.subsequence调用Data的初始化程序

解决方法

您可以结合使用subdata和removeSubRange方法来获得所需的结果.

subData(in :)是Data结构上的实例方法.

removeSubRange()也是Data结构上的实例方法.

您可以在此处阅读有关这些方法的更多信息:https://developer.apple.com/reference/foundation/data

示例方法

func extract(from data: inout Data) -> Data? {
    guard data.count > 0 else {
        return nil
    }

    // Define the length of data to return
    let length = Int.init(data[0])

    // Create a range based on the length of data to return
    let range = Range(0..<length)

    // Get a new copy of data
    let subData = data.subdata(in: rangE)

    // Mutate data
    data.removeSubrange(rangE)

    // Return the new copy of data
    return subData
}

用法

// Data (27 bytes)
var data = Data(bytes: [24,42,63,78,200,3,34,36])

// First extraction
let first = extract(from: &data)
print(first!) // Prints 24 bytes
print(data) // Prints 3 bytes

// Second extraction
let second = extract(from: &data)
print(second!) // Prints 3 bytes
print(data) // Prints 0 bytes

// Third extraction
let third = extract(from: &data)
print(third ?? "No Data") // Prints "No Data"

进行扩展

您还可以将上面的提取方法包装在Data的扩展中,如下所示:

extension Data {
    mutaTing func extract() -> Data? {
        guard self.count > 0 else {
            return nil
        }

        // Define the length of data to return
        let length = Int.init(self[0])

        // Create a range based on the length of data to return
        let range = Range(0..<length)

        // Get a new copy of data
        let subData = self.subdata(in: rangE)

        // Mutate data
        self.removeSubrange(rangE)

        // Return the new copy of data
        return subData
    }
}

然后你可以使用这样的方法

// Data (27 bytes)
var data = Data(bytes: [24,36])

// First extraction
let first = data.extract()
print(first!) // Prints 24 bytes
print(data) // Prints 3 bytes

// Second extraction
let second = data.extract()
print(second!) // Prints 3 bytes
print(data) // Prints 0 bytes

// Third extraction
let third = data.extract()
print(third ?? "No Data") // Prints "No Data"

大佬总结

以上是大佬教程为你收集整理的ios – 在Swift 3中提取Data对象的片段全部内容,希望文章能够帮你解决ios – 在Swift 3中提取Data对象的片段所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。