1.相遇
有个业务需求,把表格中的数据整合到一个数组中,如下
Name | Age | Item1 | Item2 | Item3 | Country |
---|---|---|---|---|---|
Jack | 21 | 32 | 43 | null | China |
Tom | 23 | 83 | 67 | 75 | US |
整合后的结果是这样
[
{
"Name": "Jack","Age": 21,"score": [ { "Item1": 32 },{ "Item2": 43 } ],"Country": "China" },{
"Name": "Tom","Age": 23,"score": [ { "Item1": 83 },{ "Item2": 67 },{ "Item3": 75 } ],"Country": "US" }
]
有个中间的状态,就是把一条记录整合出来之后,取中间的几个元素作为一个整体,所以需要把中间的几个数据切片到一个新的数组中。
之前在学习Swift的时候,了解过一下数组的用法,以为是非常了解了,实则不然。
2.对于切片数组的 subscript ,你了解多少?
一个简单例子
let array = ["A","B","C","D"]
let slicedArray = array[1..<3]
print(slicedArray.count) // 2
print(slicedArray[0]) // error
WHY?
明明数组中有两个元素,但是为什么用subscript访问,却报错呢?
还有
let slicedArray String = slicedArray.reduce("start: ") { (acc,item) -> String in
"\(acc)\(item)"
}
print(slicedString) // start: BC
很明显这个”数组”中是有数据的呀,怎么就是取不出来呢?
3.startIndex & endIndex
slicedArray 的 startIndex 和 endIndex 是多少呢?
print(slicedArray.startIndex) // 1 instead 0
print(slicedArray.endIndex) // 3
所以,在用[0]访问slicedArray的时候,其实是越界的 out of bounds !!!!
4.怎么解决这个问题
不去详细的解释为什么,这个跟swift对数组的设计理念相关,copy-on-write,目的之一提高性能
两个方案解决这个问题:
违背swift的设计原则
直接创建一个新的数组变量let lastedArray = Array(array[1..<3]) print(lastedArray.startIndex) // 0 print(lastedArray.endIndex) // 2 print(lastedArray[0]) // B
使用数组的属性
startIndex
,endIndex
combinedArray[combinedArray.startIndex] // B combinedArray[combinedArray.startIndex.advancedBy(1)] // C