大家好,关于深入解析 Swift 数组索引安全性与切片操作很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
一、安全的索引集合元素
对集合索引执行安全检查是必要且通常可行的。最常见的是对数组和字典索引的安全检查。这部分类似于Objective-C 中数组索引的安全检查。扩展Swift数组,让你的Swift数组也具备数组安全检查的功能。
1. NSArray 对Objective-C 中索引的安全扩展
下面的代码非常简单。它是Objective-C 中NSArray 的扩展。该方法位于NSArray相关扩展中。在你的项目中,如果添加此扩展代码,则可以通过objectAtIndexSafe: 方法安全地索引数组。从代码中不难看出,在定义函数参数时,我们将index声明为NSUInteger,它是一个正整数,这样就排除了你向下标传递负数的情况。然后验证该索引的合法性。如果索引不在数组的有效范围内,则返回nil。当要查找的元素不存在时,返回nil不会导致程序崩溃,因为nil的地址是0x0,这类似于将引用清零。
当然,以下只是NSArray 安全扩展方法之一。有许多扩展的安全方法。例如数组的增删改查等都可以进行相应的扩展。扩展方法和思路与下面的简单代码类似。再说一次,这并不需要太多时间。我们用了很多篇幅来介绍它。
````
1- (id)objectAtIndexSafe:(NSUInteger)index {2if(index self.count-1) {3returnnil;4}5return[self objectAtIndex:index];6}
````
2. Swift 中对Array 的安全扩展
以上是对Objective-C中安全方法的简单介绍。即使是介绍Swift相关的内容,下面也会给出Swift语言中类似的方法。在介绍Swift相关的方法时,我会尽量详细,因为毕竟这篇博客主要是关于Swift的内容。接下来,上述Objective-C中的NSArray数组索引安全验证方法将在Swift语言中重新使用。当然,重写后的内容也非常容易理解。
(1)主要重载下标方法。在重载下标方法中,通过三元运算符检查索引范围的安全性。如果索引为0.
下面是数组索引的安全检查。
1extension Array {2下标(安全索引: Int)-Element?{3return(0.
(2) 以上是Swift中Array的安全索引扩展。下一步就是简单地使用它。下面的代码片段是对上述安全扩展功能的测试。首先,创建一个数组testArray,
然后创建了一个索引数组indexes,
然后遍历indexes中的元素值,作为testArray的下标,检索testArray。当然,检索时使用的是我们上面定义的安全方法,并且indexs下标数组中存在非法下标。在这种情况下,让我们验证一下我们的安全方法。
当然,在数组遍历中,我们使用for-in循环来检索indexes中的每个索引,然后使用guard语句来检索testArray中的值。使用guard语句可以有效过滤掉由于非法索引而返回的nil值。具体代码片段如下:
上面的代码片段并不难理解。上述测试代码的运行结果如下。运行结果能够很好地说明问题,并且不会在索引非法时崩溃,并合理给出相应的错误提示。具体运行结果请看下面。
上述扩展还可以通过扩展整个集合类型,即CollectionType来进行扩展。但扩展CollectionType时,必须限制Index的where子句的使用,使得Index必须遵守Comparable协议。具体实现如下,但是以下方法比较谨慎使用,因为数组通常会越界,因为在字典中,如果为不存在的键索引一个值,则会返回nil值没有崩溃。但在数组中,如果索引不存在的索引,则会抛出错误。下面是另一种处理方法,不过这种方法用得比较少。
实现下面的扩展后,您还可以使用数组中的safe 方法。
2. 使用具有多个索引下标的数组
扩展功能非常强大,本节将给出另一个数组的扩展。该扩展的作用是通过多个索引给数组设置值,并通过多个索引一次性获取多个数组的值。这个功能很强大,会逐步实现。
1.了解zip()函数和Zip2Sequence
在实现数组的多索引扩展时,需要使用zip()函数。 zip() 函数接收两个序列并返回Zip2Sequence 类型数据。 zip() 函数到底有什么作用?接下来,我们将使用一个小示例来处理zip() 函数。首先看一下Apple的帮助文档中对zip()函数的介绍。详情如下:
上面的英文句子大概意思是“基于两个基本序列构造出一个序列对,在序列对中,第i对代表每个基本序列中的第i个元素”。在定义zip函数的过程中,我们可以看到zip()是一个泛型函数,它接收两个SequenceType类型的参数,然后返回Zip2Sequence类型的数据。新创建的序列对存在于Zip2Sequence 中。话虽如此,还是给个小demo比较划算。通过一个小例子,zip()函数的用法一目了然。
(1)创建两个数组zip1和zip2,将这两个数组作为zip()函数的参数,并合并这两个数组。具体实现如下:
(2) 从上面的程序可以看出,zipSum是一个Zip2Sequence,
对于Array类型常量,我们可以使用dump()打印zipSum常量并观察数据存储结构。具体结构如下:
输出结果如下。从结果中很容易看出序列中有两个元素。第一个元素对应于数组zip1,第二个元素对应于数组zip2。
(3) 下一步是通过for-in 循环遍历zipSum 序列。下面是遍历zipSum 的代码。
上面zipSum遍历的结果如下。从下面的输出结果可以看出,输出是成对遍历的。如果数组中的元素是多余的,它们将被忽略。
2. 数组中多个索引的扩展实现
在这个要实现的扩展中,我们扩展了Array,并重载了扩展中的下标方法,使其可以接受多个下标,对多个下标对应的值进行索引,并将索引结果组成一个数组。下标方法中,通过get方法获取索引对应的值,通过set方法设置对应的索引值。下面的代码片段是这个扩展的实现:
````
1extension Array {2subscript(i1: Int, i2: Int, rest: Int.) -[Element] {3//通过实现get方法获取数组中对应的值4get{5varresult: [Element]=[self[i1], self [i2]]6forindexinrest {7result.append(self[index])8}9returnresult10}1112//通过set方法设置数组对应的索引13set(values) {14for(index, value)inzip([i1, i2 ] +rest, values ) {15self[索引]=值16}17}18}19}
````
上述扩展的实现并没有太多困难。 subs的两个脚本函数中均使用了可变参数,且下标函数参数个数在两个以上(含两个)。然后就是通过zip()函数和zip()函数返回的结果集来设置多个下标索引的值。经过上面的扩展,我们就可以通过多个索引来对数组进行操作了。上述扩展可以按如下方式使用:
3. 数组切片
OC中不存在数组切片。这是Swift 中新引入的概念。本节将讨论数组切片,研究数组切片的用法和特点。我们先通过一个小Demo来看一下如何生成数组切片。下面的代码片段首先通过map函数将字符串转换为数组arrayTest。
然后我们创建该数组的一个切片。下面的代码片段在arrayTest 数组中创建下标3 到下标6 范围内的切片。 arraySlices 是数组切片变量,其类型为ArraySlice。具体代码片段如下。
数组切片需要注意的一点是,数组切片的下标与原数组中的下标一致。如果我们想取出切片arraySlices中的第一个值,我们必须使用arraySlices[3],
不使用arraySlices[0],如果使用arraySlices[0],则会报错,如下所示:
因为数组是值类型,虽然切片与原数组有对应的数组下标,但切片是原数组的部分副本,因此修改切片或修改原数组不会互相影响。下面以测试为例进行说明,如下所示:
如果切片转为枚举,则切片中原数组对应的下标关系将不存在。下面就是将切片转换成枚举序列,然后进行遍历。代码如下:
关于深入解析 Swift 数组索引安全性与切片操作和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
【深入解析 Swift 数组索引安全性与切片操作】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这个题目听起来很有意思!我对如何保证数组安全索引一直很感兴趣。
有9位网友表示赞同!
我最近在写一个项目的时候遇到过数组越界的错误,学习一下这些安全措施感觉很重要啊。
有14位网友表示赞同!
看下标题,感觉可以让我更好地理解如何在Swift中操作数组切片,挺期待的!
有12位网友表示赞同!
我有点 confused 数组的安全索引和切片之间的关系,也许这篇文章能解释清楚。
有17位网友表示赞同!
学习 Swift 中的内存管理和安全相关知识是很有必要的,看来这篇文章很合适。
有17位网友表示赞同!
Swift 的数组操作方式还是比较简洁的吗?应该会更容易理解吧?
有13位网友表示赞同!
如果可以学习一些避免错误的方法,对于我来说是非常有用的!
有13位网友表示赞同!
感觉数组切片是一个很有用的功能,能提高代码的效率吗?
有15位网友表示赞同!
希望这篇文章能够讲解清楚这些概念,方便我日后开发中更好地使用。
有7位网友表示赞同!
我一直都比较喜欢 Swift 的语法,这篇文章应该可以进一步加深我对它的理解。
有18位网友表示赞同!
最近在研究并发的编程,想知道数组安全索引和切片是否对并发操作有影响?
有14位网友表示赞同!
学习一些新的技术总是很好,这种文章能让我的知识面更广。
有13位网友表示赞同!
希望这篇文章能够给出一些实际的例子,这样更容易理解。
有7位网友表示赞同!
我以前用的其他语言数组操作方法比较复杂,Swift 真的挺人性化的!
有7位网友表示赞同!
可以分享一下你对 Swift 编程风格的一些看法吗?
有5位网友表示赞同!
听起来这篇文章会让我对 Swift 的底层机制有更深的了解。
有5位网友表示赞同!
我觉得学习 Swift 相关的技巧和知识很能提升我的开发能力!
有12位网友表示赞同!
期待看一看这个方面的进阶攻略,我的代码希望能更加高效完善。
有12位网友表示赞同!