Swift 4中如何用另一个Data([UInt8])分割Data类型数据?
实现Data按另一个Data分割的方法
嗨,作为Swift新手碰到这个问题太正常了——官方的Data.split(...)方法确实只支持单个UInt8作为分隔符,要处理整个Data作为分隔符的场景,确实得自己实现一个遍历查找的逻辑,不过操作起来没那么复杂,我给你写个实用的扩展方法:
扩展Data实现自定义split方法
直接给Data加一个扩展,实现你想要的split(separator: Data)功能:
extension Data { func split(separator: Data) -> [Data] { guard !separator.isEmpty else { return [] } var resultChunks: [Data] = [] var currentPosition = startIndex // 循环查找分隔符的位置 while let separatorRange = self[currentPosition...].range(of: separator) { // 截取当前位置到分隔符起始处的片段 resultChunks.append(self[currentPosition..<separatorRange.lowerBound]) // 跳过分隔符,更新下一次查找的起始位置 currentPosition = separatorRange.upperBound } // 添加最后一段未被分隔的内容(如果存在) if currentPosition <= endIndex { resultChunks.append(self[currentPosition...]) } return resultChunks } }
代码逻辑说明
- 首先判断分隔符是否为空,避免后续逻辑出现异常;
- 用
range(of:)方法在剩余的Data片段里查找分隔符的位置,这个方法会返回第一个匹配的范围; - 每次找到分隔符后,截取前面的部分加入结果数组,然后把查找起始位置跳到分隔符的末尾;
- 循环结束后,处理最后一段没有被分隔符截断的内容,确保不会遗漏。
测试你的示例数据
用你提供的测试数据跑一下:
var data: Data = Data([0x00, 0x00, 0x00, 0x01, 0xAB, 0x02, 0x03, 0x00, 0x00, 0x00, 0x01, 0xEE, 0xBB, 0x14, 0x24]) var separator: Data = Data([0x00, 0x00, 0x00, 0x01]) let splitResult = data.split(separator: separator) // 结果数组包含3个元素: // 1. 空Data(第一个分隔符前没有内容) // 2. Data([0xAB, 0x02, 0x03]) // 3. Data([0xEE, 0xBB, 0x14, 0x24])
这个行为和你预期的data.split(separator: separator)完全一致,而且和Swift字符串的split逻辑保持了一致(比如连续分隔符会生成空元素)。
如果是处理超大体积的Data,这个方法的效率也足够日常使用,要是有极致性能需求,可以考虑优化查找算法,但一般场景下这个实现就够用啦~
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

