欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析 Swift 数组索引安全性与切片操作

时间:11-07 神话故事 提交错误

大家好,关于深入解析 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 数组索引安全性与切片操作和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

用户评论

無極卍盜

这个题目听起来很有意思!我对如何保证数组安全索引一直很感兴趣。

    有9位网友表示赞同!

铁树不曾开花

我最近在写一个项目的时候遇到过数组越界的错误,学习一下这些安全措施感觉很重要啊。

    有14位网友表示赞同!

素衣青丝

看下标题,感觉可以让我更好地理解如何在Swift中操作数组切片,挺期待的!

    有12位网友表示赞同!

虚伪了的真心

我有点 confused 数组的安全索引和切片之间的关系,也许这篇文章能解释清楚。

    有17位网友表示赞同!

﹎℡默默的爱

学习 Swift 中的内存管理和安全相关知识是很有必要的,看来这篇文章很合适。

    有17位网友表示赞同!

闲肆

Swift 的数组操作方式还是比较简洁的吗?应该会更容易理解吧?

    有13位网友表示赞同!

■□丶一切都无所谓

如果可以学习一些避免错误的方法,对于我来说是非常有用的!

    有13位网友表示赞同!

容纳我ii

感觉数组切片是一个很有用的功能,能提高代码的效率吗?

    有15位网友表示赞同!

此生一诺

希望这篇文章能够讲解清楚这些概念,方便我日后开发中更好地使用。

    有7位网友表示赞同!

琴断朱弦

我一直都比较喜欢 Swift 的语法,这篇文章应该可以进一步加深我对它的理解。

    有18位网友表示赞同!

迷路的男人

最近在研究并发的编程,想知道数组安全索引和切片是否对并发操作有影响?

    有14位网友表示赞同!

莫名的青春

学习一些新的技术总是很好,这种文章能让我的知识面更广。

    有13位网友表示赞同!

╭摇划花蜜的午后

希望这篇文章能够给出一些实际的例子,这样更容易理解。

    有7位网友表示赞同!

安好如初

我以前用的其他语言数组操作方法比较复杂,Swift 真的挺人性化的!

    有7位网友表示赞同!

你是梦遥不可及

可以分享一下你对 Swift 编程风格的一些看法吗?

    有5位网友表示赞同!

仰望幸福

听起来这篇文章会让我对 Swift 的底层机制有更深的了解。

    有5位网友表示赞同!

话扎心

我觉得学习 Swift 相关的技巧和知识很能提升我的开发能力!

    有12位网友表示赞同!

半梦半醒i

期待看一看这个方面的进阶攻略,我的代码希望能更加高效完善。

    有12位网友表示赞同!

【深入解析 Swift 数组索引安全性与切片操作】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活