Swift 入门学习:集合(Collection)类型趣谈-下

2024-03-10 01:28

本文主要是介绍Swift 入门学习:集合(Collection)类型趣谈-下,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

概览

集合的概念在任何编程语言中都占有重要的位置,正所谓:“古来聚散地,宿昔长荆棘;游人聚散中,一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理,怎能不让我们满心欢喜呢?

在这里插入图片描述

在 Swift 入门学习:集合(Collection)类型趣谈-上 这篇博文中,我们已初步学习了集合的相关知识。而在下篇中,我们将继续集合的探索之旅。

在本篇博文中,您将学到如下内容:

  • 概览
  • 4. Set
  • 5. “无限大”的范围类型(Range)
  • 6. 标准库集合的扩展
  • 总结

Swift 中集合的概念简约而不简单,所以让我们闲言少叙,马上开始吧。

Let’s collect it now!!!😉


4. Set

Set 也是一种集合类型,它同样要求其内部元素都遵守 Hashable 协议:

在这里插入图片描述

字典类似, Set 也是无序的。而且每个 Hashable 值相同的元素只能在 Set 中出现一次:

在这里插入图片描述

与其它集合类似,我们也可以方便的遍历它的元素:

let set = Set<Int>([1,2,2,3,3,4,4,5,5])for i in set {print(i)
}let ary = set.map { $0 * $0}

与其它集合所不同的是,我们可以对其进行数学上的基本集合操作(Fundamental Set Operations)。

在这里插入图片描述

比如:计算两个 Set 间的并集、交集、对称差等等:

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]

我们还可以测试集合间的归属性和相等性(Set Membership and Equality):

在这里插入图片描述

比如在下面的代码中,我们就分别检查了 houseAnimals 是否是 farmAnimals 的子集、farmAnimals 是否是 houseAnimals 的超集、以及 farmAnimals 是否和 cityAnimals 完全不搭噶:

let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true

从上面的讨论可知,除了一般意义上的集合,Set 还可以被当做数学概念上的集合来使用。

可能有的小伙伴们并不知道,早在 Objective-c 的“远古时代”就存在一种计数 Set 类型:NSCountedSet,它是 Set 的一种变体:

在这里插入图片描述

它也被用来表示一个 Set,但其中相同的元素可以重复出现。注意它是作为一个类(而不是结构)实现的:

在这里插入图片描述

5. “无限大”的范围类型(Range)

小伙伴们可能会好奇:Swift 中的集合到底能不能包含无穷多个元素?

包含无限元素的集合对于一些动态语言来说简直不要太容易,比如 ruby 语言:

在这里插入图片描述

那么,对于 Swift 这种貌似偏静态的语言也能办得到吗?答案是肯定的!

在 Swift 语言中,有一种范围(Range)类型专门用来表示一段范围内元素的集合。注意这是一种“半包(half-open)”类型,因为 Range 中的元素并不包括它的上界(upper bound)。

在这里插入图片描述

大家可能会猜到,为了增加灵活性还有一种“全包”的 Range 类型:ClosedRange。
在这里插入图片描述

创建 Range 实例更是小菜一碟,我们可以一如既往的用语法糖或是构造器来实现:

// 从 1 开始,不包括 10;下同
let half_range = 1..<10
let half_range_1 = Range(uncheckedBounds: (1,10))
// 从 1 开始,包括 10;下同
let range = 1...10
let range_1 = ClosedRange(uncheckedBounds: (1,10))

同样的,遍历范围的操作也好似“蜻蜓点水”:

for i in half_range {print(i)
}half_range.forEach { print($0)}

因为 Range 也是一种集合,所以我们可以把它轻松转换为数组:

let half_range = 1..<10
let ary = Array(half_range)

之前在介绍数组时提到过惰性序列,Range 就可以被看做一种 LazySequence。这意味着,我们可以用几乎忽略不计的代价就创建出非常“巨大”的 Range:

// 瞬间即可创建包含海量元素的 Range
let half_range = 1..<10000000000
for i in half_range.prefix(10) {print(i)
}

因为 Range 是一种惰性序列,所以它的元素只有在实际使用时才会被求值,这使得它的创建开销非常小。相反,如果我们要创建一个包含 100 亿个元素的 Array,即使只会用到前 10 个,内存也会“实打实”的被 100 亿个元素所占用,真是让人欲哭无泪!

由于 Range 足够“懒惰”,它可以表示无穷个元素。比如,在如下代码中我们用 inf_range 来表示所有自然数:

// 包含所有自然数的范围
let inf_range = 1...
for i in inf_range {if i > 10 { break }print(i)
}// 千万别这么做!!!
let inf_ary = Array(inf_range)

对于“无限大”的范围,千万不要试图将其转换为 Array,因为除了无限挂起你啥也得不到。


有的小伙伴对于上面自然数的定义会有不同看法,他们会认为 0 也是自然数。对于这个有趣问题,我写过一篇同样有趣的博文,感兴趣的小伙伴们可以猛戳以下链接观赏:

  • 有趣的小实验:五种语言搞定“超超超难”剑桥面试数学题

在这里插入图片描述


由于 Range 的惰性特质加持,当仅需处理海量数据中的一小部分时,我们可以优先考虑它。当然,普通的数组也是可以转换为惰性序列的:

let MAX = 10000
// 创建一个包含 1w 个元素的数组,并初始化
var ary = [Int](repeating: 0, count: MAX)for i in 0..<MAX {ary[i] = i * i
}let lazy_ary = ary.lazy
for i in lazy_ary {guard i < 100 else { break }print(i)
}

6. 标准库集合的扩展

在学完上面那么多集合类型之后,如果小伙伴们还是觉得找不到“趁手的兵器”,那么除了自己打造全新的“雷神之锤”以外,我们还可以使用 Apple 官方的 Swift Collections 框架:

在这里插入图片描述

  • Swift Collections

Swift Collections 包括了一些 Swift 标准库中未实现的超实用集合类型,比如:BitSet、Deque、Heap 等等,完整的集合类型列表在此:

在这里插入图片描述
在这里插入图片描述

可以看到,Swift Collections 框架中包括了 SortedSet 和 SortedDictionary 两种集合类型。它们分别对应于标准库中的 Set 和 Dictionary 类型,但却是有序的。

我们可以通过 SPM 的方式将 Swift Collections 框架方便的导入到自己的项目中,然后大家就可以发挥天马行空的想象力来驾驭里面各个绝妙的集合利器啦!棒棒哒!

总结

在本篇博文中,我们接上篇继续介绍了 Swift 语言中集合类型 Set,并讨论了如何用 Range 类型来表示无穷多元素的集合;我们还介绍了苹果官方 Swift Collections 框架中更多的集合类型,超赞的哦。

感谢观赏,再会!😎

这篇关于Swift 入门学习:集合(Collection)类型趣谈-下的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792563

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学