Swift data范围截取问题解决方案
作者:鸑鷟凤凰
一、截取字符串的几种方法
1. 截取前几位
mobileID.prefix(32)
2. 截取后几位
mobileID.suffix(3)
3. subData
data.subdata(in: 0..<4)
4. 下标截取
data[0..<4]
二、subData(in:) 报错 EXC_BREAKPOINT
原因:Data值(或一般的集合)的索引不一定是从零开始的。
这里有一段代码
let array:[UInt8] = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06] let data = Data(bytes: array) //问题:请问以下六个的结果是? data.subdata(in: 3...4).forEach{ print("a \($0)") } data.subdata(in: 3..<3).forEach{ print("b \($0)") } data.subdata(in: 3..<4).forEach{ print("c \($0)") } data[3...4].forEach{ print("A \($0)") } data[3..<3].forEach{ print("B \($0)") } data[3..<4].forEach{ print("C \($0)") }
结果:
data.subdata(in: 3...4).forEach{ print("a \($0)") }// 报错 Cannot convert value of type 'ClosedRange<Int>' to expected argument type 'Range<Data.Index>' (aka 'Range<Int>')
data.subdata(in: 3..<3).forEach{ print("b \($0)") }// 空值
data.subdata(in: 3..<4).forEach{ print("c \($0)") }// c 4
data[3...4].forEach{ print("A \($0)") }// A 4 A 5
data[3..<3].forEach{ print("B \($0)") }// 空
data[3..<4].forEach{ print("C \($0)") }// C 4
data.subdata(in: 3…4) 报错原因:
此方法要求的传值为Range<Data.Index> (Data.Index其实就是Int)
而 3…4 实际上是ClosedRange
我们知道,Swift3.0以后,Range有四种:
而这四种Range并不能在互相之间直接转换因此 data.subdata(in: 3…4) 就会报上述错误
为什么下标取值既能用CountableClosedRange,也能用CountableRange?
翻阅Swift源代码就知道原因Swift对四种Range都定义了下标取值
到此这篇关于Swift data范围截取问题的文章就介绍到这了,更多相关Swift data范围截取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!