SWIFT中的数组

这篇文章也在我的博客上发布:https://truongnn.me/2019/03/19/arrayslice-in-swift/

在本文中,让我们讨论Swift中的ArraySlice:

内容

  • 介绍
  • 创建一个ArraySlice
  • 实际示例:为数组实现Chunk方法

介绍

该结构描述了Swift中数组的“切片”。

如图像所示,ArraySlice的startIndex并不总是零,这取决于我们如何“切片” Array

创建一个数组:

让我们检查一些如何创建ArraySlice的示例:

下降

 让testArray = [1,2,3,4,5] 
让arraySlice = testArray.dropLast()//返回ArraySlice [1,2,3,4]

后缀

 让testArray = [1,2,3,4,5] 
让arraySlice = testArray.suffix(2)//返回ArraySlice [4,5]

字首

 让testArray = [1,2,3,4,5] 
让arraySlice = testArray.prefix(2)//返回ArraySlice [1,2]

范围

 让testArray = [1,2,3,4,5] 
让arraySlice = testArray [1 .. <3] //返回ArraySlice [2,3]

实际示例:阵列的实现阻塞方法

给定一个数组,实现一个“块”方法,该方法将数组分成具有预定义大小的多个子数组:

 让数组= [1,2,3,4,5,6] 
令大小= 2
让结果= array.chunk(大小:大小)
//结果= [[1,2],[3,4],[5,6]]
 让数组= [1,2,3,4,5,6,7] 
令大小= 20
让结果= array.chunk(大小:大小)
//结果= [1,2,3,4,5,6,7]
 让数组= [Int]() 
让结果= array.chunk(大小:2)
//结果:空数组

让我们在Array的Extension中实现此方法:

 扩展数组{ 
func chunk(size:Int)-> Array <Array > {
var结果= [Array ]()
var loopIndex = startIndex
而loopIndex <endIndex {
var arraySlice:ArraySlice !
如果让index = index(loopIndex,offsetBy:size,limitedBy:endIndex){
arraySlice = self [loopIndex .. <index]
loopIndex =索引
}其他{
arraySlice = self [loopIndex .. <endIndex]
loopIndex = endIndex
}
让array = Array(arraySlice)
result.append(array)
}
返回结果
}
}

逻辑很简单:将Array切成ArraySlice,每个ArraySlice的length = size,用以下方法构建subArray:

让array = Array(arraySlice)。

如果我们无法再对Array进行切片,则意味着“大小”大于Array.count或偏移量超出范围,只需中断While循环即可。

为此方法进行单元测试:

 类ArrayExtensionTests:XCTestCase { 

func test_chunk_whenArrayIsEmpty_shouldReturnEmptyArray(){
让数组= [Int]()
让结果= array.chunk(大小:2)
XCTAssertTrue(result.count == 0)
}

func test_chunk_whenArrayCanDivideBySize_shouldReturnArrayWithSizeEqualArraySizeDivideBySize(){
让数组= [1,2,3,4,5,6]
令大小= 2
让结果= array.chunk(大小:大小)
XCTAssert(result.count == 3,“结果应包含3个项目”)
}

func test_chunk_whenArraySizeModulBySize_shouldReturnArrayWithSizeEqualArraySizeDivideBySizePlusOne(){
让数组= [1,2,3,4,5,6,7]
令大小= 2
让结果= array.chunk(大小:大小)
XCTAssert(result.count == 4,“结果应包含4个项目”)
}

func test_chunk_whenSizeGreaterThanArraySize_should_ReturnArrayWithSizeEqualOne(){
让数组= [1,2,3,4,5,6,7]
令大小= 20
让结果= array.chunk(大小:大小)
XCTAssert(result.count == 1,“结果应包含1个项目”)
}

}

你怎么看? 让我知道您的问题并给我反馈。

谢谢阅读!

Interesting Posts