MY_Swift_数组安全索引与数组切片
来源:互联网 发布:淘宝韩版男装店铺 编辑:程序博客网 时间:2024/06/01 11:49
一、安全的索引集合元素
对一个集合索引进行安全检查是很有必要的,也是经常实用的,最常见的就是对数组和字典索引的安全检查,该部分内容就是类比这Objective-C中的数组索引的安全检查来扩充Swift的数组,从而让你的Swift数组也同样具备对数组安全检查的功能。
1. Objective-C中NSArray对索引的安全扩展
下方这段代码是非常简单的,它是对Objective-C中的NSArray做的扩展,该方法位于NSArray相关的延展中。在你的项目中,如果添加了此段延展代码,那么你就可以通过objectAtIndexSafe:方法对数组进行安全的索引。有代码不难看出在定义该函数参数时,我们将index声明为NSUInteger,也就是正整数,这就排除了你对下标传入一个负数。紧接着又对index的合法性进行验证,如果index不在数组有效范围内,那么就返回nil。当你查找的元素不存在时,你返回nil是不会造成程序崩溃的,因为nil的地址是0x0, 这和归零若引用有些类似。
当然下方只是NSArray安全扩展其中一个方法,还有许多扩展的安全方法,比如数组的增删改查都可以进行相应的安全扩展,扩展的方式和思路与下方这段简单代码类似,再次就不花过多的篇幅对其进行介绍了。
1 - (id)objectAtIndexSafe:(NSUInteger)index {2 if (index > self.count-1) {3 return nil;4 }5 return [self objectAtIndex:index];6 }
2.Swift中对Array的安全扩展
上面简单的对Objective-C中的安全方法进行了简单的介绍,就算是对Swift相关内容的引子吧,下方将会给出Swift语言中类似的方法。对Swift相关方法介绍时,我会尽量的详细一些,因为毕竟本篇博客主要是关于Swift内容的。接下来将对上面Objective-C中NSArray数组索引安全验证的方法使用Swift语言进行重新。当然重写的内容也是非常容易理解的。
(1)主要是对subscript方法进行重载,在重载的subscript方法中,对index的范围通过三目运算符进行了安全检查。如果index在0..
1 extension Array {2 subscript (safe index: Int) -> Element? {3 return (0..<count).contains(index) ? self[index] : nil4 }5 }
(2)上面是对Swift中的Array进行了安全索引扩展,接下来就是简单的使用了,下方的代码段是对上面安全扩展函数的测试。首先创建了一个数组testArray, 然后创建了一个索引数组indexs, 然后遍历indexs中的元素值,将其作为testArray的下标,对testArray进行检索。当然检索时,使用的是我们上面定义的safe方法,并且在indexs下标数组中存在非法的下标。在这种情况下,我们来验证一下我们的安全方法。
当然在数组遍历中,我们使用了for-in循环取出indexs中的每个index, 然后使用guard语句取出testArray中的值。使用guard语句能很好的过滤掉因为非法的index而返回的nil值。具体代码段如下所示:
上面的代码段理解起来并不难,上述测试代码的运行结果如下所示,从运行结果可以很好的说明问题,并且在index非法时不会崩溃,并合理的给出相应的错误提示,请看下方具体运行结果。
上面的延展也可以通过对整个集合类型,也就是CollectionType进行扩展,不过在扩展CollectionType时要对Index使用where子句进行限制,使Index必须符合Comparable协议,具体实现如下所示,不过下面的方法比较少用,因为一般是数组存在越界的情况,因为在字典中,如果你对一个不存在的键进行值的索引,会返回nil值,而不会崩溃。但是在数组中,你对不存在的index进行索引,就会抛出错误。下方是另一种处理方式,不过该方式用的比较少。
实现下方延展后,同样可以在数组中使用safe方法。
- MY_Swift_数组安全索引与数组切片
- numpy数组切片与索引
- ndarray数组的索引与切片
- GoLang数组与切片
- Go数组与切片
- python数据分析:numpy数组的索引与切片
- NumPy数组基本的索引和切片
- numpy数组切片索引的详细讲解
- golang中的数组与切片
- 数组切片
- 数组切片
- 索引数组与删除数组
- Golang中 的数组与切片
- golang 数组(array)与切片(slice)
- 5.go slice, 切片与数组, map
- 【NumPy学习指南】day4 多维数组的切片和索引
- numpy多为数组和切片的索引
- go的学习记录(二)--- 数组与数组切片
- netwatch详解,RouterOS-IP检测并执行对应脚本
- plsql中substrb、sbustr的区别
- 数据库锁机制
- 自我救赎之路--java(jar包导入)
- BottomSheetDialogFragment 的使用
- MY_Swift_数组安全索引与数组切片
- Kryo序列化与反序列化列子
- CentOS7,MySQL主从配置和读写分离(MySQL主从、MySQL读写分离、MySQL分布式、数据库读写分离、主从配置)
- phoenix-hbase 服务频繁挂掉问题排查
- C语言模拟实现C++的继承与多态
- 关于android 的事件分发机制
- 数组的交集、并集……
- SQL CONSTRAINT
- let和const命令学习总结