Swift 里集合类型协议的关系

Sequence

A type that provides sequential, iterated access to its elements.

是最基础的协议,可以通过迭代来获取它的元素。
有两个关联类型:

  /// A type representing the sequence's elements.associatedtype Element/// A type that provides the sequence's iteration interface and/// encapsulates its iteration state.associatedtype Iterator : IteratorProtocol where Iterator.Element == Element

遵守Sequence 协议,只需要实现makeIterator()方法即可。 在迭代过程中,Sequence的序列是否被破坏,并没有要求。因此,两次迭代同一个Sequence,可能会得到不同的结果。

Collection

A sequence whose elements can be traversed multiple times, nondestructively, and accessed by an indexed subscript.

sequence基础上,增加了几个性质

  1. 多次遍历,不会对序列的结构造成影响
  2. 可以通过下标索引

引入了几个和索引相关的关联类型

associatedtype Index : Comparable
/// A type that represents the indices that are valid for subscripting the
/// collection, in ascending order.
associatedtype Indices : Collection = DefaultIndices<Self>
where Indices.Element == Index, Indices.Index == Index,Indices.SubSequence == Indices

通过下标获取值的方法如下,复杂度是O(1)

subscript(position: Index) -> Element { get }

可以通过下标来遍历,那么必须定义下标的successor

func index(after i: Self.Index) -> Self.Index

BidirectionalCollection

A collection that supports backward as well as forward traversal.

继承了Collection协议,增加了可以反向遍历的功能。
通过一个下标,可以找到上一个下标。

func index(before i: Index) -> Index

这也为和last相关的方法提供了基础

RandomAccessCollection

A collection that supports efficient random-access index traversal.

继承了BidirectionalCollection,因此可以正向/反向遍历。还对遍历的效率做出来要求,

Random-access collections can move indices any distance and measure the distance between indices in O(1) time

MutableCollection

A collection that supports subscript assignment.

继承了collection协议,提供了可以改变元素值的能力。

override subscript(position: Index) -> Element { get set }

这个下标操作,提供了set方法。 对应的,提供了默认的分片方法(O(n))

  /// - Complexity: O(*n*), where *n* is the length of the collection.mutating func partition(by belongsInSecondPartition: (Element) throws -> Bool) rethrows -> Index

也提供了交换方法

  /// - Complexity: O(1)mutating func swapAt(_ i: Index, _ j: Index)

RangeReplaceableCollection

A collection that supports replacement of an arbitrary subrange of elements with the elements of another collection.

继承了collection,增加了可以某一个子区间内的元素,可以被另一个collection替代的能力。
collection增加了插入和删除的能力。

  mutating func append(_ newElement: __owned Element)mutating func append<S : Sequence>(contentsOf newElements: __owned S)where S.Element == Elementmutating func insert(_ newElement: __owned Element, at i: Index)mutating func insert<S : Collection>(contentsOf newElements: __owned S, at i: Index)where S.Element == Elementmutating func remove(at i: Index) -> Elementmutating func removeSubrange(_ bounds: Range<Index>)

转载于:https://www.cnblogs.com/huahuahu/p/Swift-li-ji-he-lei-xing-xie-yi-de-guan-xi.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET 实现登录界面(生成验证码)

这周末也没干啥&#xff0c;真正开始ASP&#xff0c;做了个学籍管理系统的登录界面&#xff0c;登录界面主要包括用户名、密码、验证码&#xff0c;界面字体用了<font size"5" color"blue" font-family:"华文琥珀";></font>改变字体…

C/C++语言void及void指针深层探索

1.概述  许多初学者对C/C语言中的void及void指针类型不甚理解&#xff0c;因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说&#xff0c;并详述void及void指针类型的使用方法与技巧。2.void的含义  void的字面意思是“无类型”&#xff0c;void *则为“无…

多域资源整合之基础准备--DNS配置

由于公司的战略调整,需要整合集团内的资源,当然也也包含IT资源,我们需要评估多家公司的IT架构统一,顺利的合并到总集团的IT架构里,这也就产生一个多域的整合的一个案例,在此分享给大家,希望对大家有所帮助&#xff01;篇幅较长&#xff0c;让我们慢慢细化&#xff01; 在这次的…

python__实参前加*和**的(拆包)功能

print(--------元组打散--------) tup(1,2,3) print(tup) print(*tup) print(--------列表打散--------) list[1,2,3] print(list) print(*list) print(--------字符串打散------) strhello print(str) print(*str) print(--------字典打散--------) def func_dic(name,age):pr…

内存淘汰机制 LRU cache

LRU cache机制的目的是为了减少频繁查找的开销&#xff0c;包括磁盘IO等。 (1)、如果LRU中存在则从LRU缓存中查找&#xff0c;查找到了之后放到容器(list)的最前面 (2)、如果缓存中没有&#xff0c;则从其地方(数据库、磁盘、文件)中读取&#xff0c;读取之后放到容器的最前面…

字符与字符串操作——Windows via C/C++

在最新版的Windows, Windows Vista&#xff0c;它应该支持Unicode 5.0。在编程中对字符与字符串的操作是很普通的&#xff0c;为新的系统写代码&#xff0c;尽可能使用Unicode&#xff0c;它提供了更好的性能&#xff0c;以及可以进行区域化。而且与COM及.Net框架互操作时也有帮…

cmd常用命令总结

CMD命令&#xff1a;开始&#xff0d;>运行&#xff0d;>键入cmd或command&#xff08;在命令行里可以看到系统版本、文件系统版本&#xff09;chcp 修改默认字符集chcp 936默认中文chcp 650011. appwiz.cpl&#xff1a;程序和功能 2. calc&#xff1a;启动计算器 5. ch…

生产者-消费者模式的实现

// 生产者-消费者模式 无锁队列 get()时&#xff0c;如果deque里面没有元素了&#xff0c;则会一直阻塞,还有待改进的空间 template <class T> class BlockingQueue { public:explicit BlockingQueue() : shutdown_(false) {}~BlockingQueue() {}void put(const T&a…

《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(13)--- 线程安全接口和双检查加锁优化...

4.3线程安全接口&#xff08;Thread-Safe Interface&#xff09;1.问题多线程组件通常包括多个可被公共访问的接口方法以及可以改变组件状态的私有方法。为了避免出现竞争条件&#xff0c;可以使用一个组件内部的锁对访问其状态的接口方法调用串行化。尽管当每个方法都自包容的…

C++流的基本概念

在C语言中&#xff0c;数据的输入和输出&#xff08;简写为I/O&#xff09;包括对标准输入设备键盘和标准输出设备显示器、对在外存磁盘上的文件和对内存中指定的字符串存储空间&#xff08;当然可用该空间存储任何信息&#xff09;进行输入输出这三个方面。对标准输入设备和标…

天哪,flash cs4可以使动态文本旋转了

天哪&#xff0c;flash cs4可以使动态文本旋转了. 只要使用rotationZ属性即可。 这可是解决了一个跨世纪的问题&#xff0c;爽爽爽。 啊哈哈哈。 这是测试源代码。 var rTextField:TextFieldnewTextField();var textFormat:TextFormatnewTextFormat();rTextField.text"…

Java编译过程(传送门)

我不是要做一门编程语言&#xff0c;了解这个对我现在的工作也没什么帮助&#xff0c;纯粹好奇而已。 传送门转载于:https://www.cnblogs.com/flying607/p/10481239.html

Linux 系统如何调整时区和时间

比如我要吧机器调成太平洋时区&#xff0c;那么我可以输入以下的命令&#xff0c;我们创建一个Link文件来指明是Pacific Time&#xff1a; cd /etc/ rm –r localtime sudo ln -s /usr/share/zoneinfo/US/Pacific localtime 调节完时区之后&#xff0c;接下来就是设置时间&a…

C语言typedefine 和define的区别

define &#xff1a; 宏定义&#xff0c;在预编译阶段就进行处理&#xff0c;简单的字符串代换&#xff0c;typedefine&#xff1a; 编译时进行处理&#xff0c;不是简单的替换&#xff0c;而是对类型说明符的重新命名。被命名的标识符具有类型说明的功能&#xff0c;代码说明#…

博客园“图灵杯”第3届博问大赛比赛结果

经过近一个月的激烈角逐&#xff0c;博客园“图灵杯”第三届博问大赛已圆满结束。获奖园友分别是&#xff1a; 一等奖&#xff1a;邀月&#xff08;奖励图灵图书4本&#xff09; 二等奖&#xff1a;Kinglee、邢少&#xff08;奖励图灵图书2本&#xff09; 三等奖&#xff1a;Gr…

Objective-C优缺点

优点&#xff1a; 1&#xff1a;Category&#xff0c;使用category可以在不改变原来类的同时为类增加新的方法或者重写原来类的方法实现&#xff08;使用runtime方法还可以在分类中实现方法交换和添加属性操作&#xff09; 2&#xff1a;运行时 动态识别&#xff0c;动态添加方…

C++输入一个字符串,去掉这个字符串中出现次数最少的字符 例如: 输入:abcabbc 输出:bbb

统计字符的个数&#xff0c;记录出现最少的字符&#xff0c;然后再输出#include <iostream>using namespace std;int main() {char str[100];cin >> str;// 统计字符大小int count[256] {0};char *p str;while (*p ! \0){count[*p];p;}// 记录出现最少的字符 出现…

Jmeter测试监控 Summary Report界面

Jmeter测试监控 Summary Report界面 这几天使用了JMeter测试数据库在进行点查询时的读写性能&#xff0c;从网上找到了该篇文章用于备份。 所有数据写入一个文件&#xff1a;保存测试结果到本地。 文件名&#xff1a;指定保存结果。 仅日志错误&#xff1a;仅保存日志中报错…

我的LINUX学习之路之二十一之web服务器简单搭建

今天说说如何搭建HTTP服务器&#xff01; 目的&#xff1a; 使用“多IP地址”方法实现多个网站。 使用“主机头名”方法实现多个网站。 使用“多端口”方法实现多个网站。 这回用图形界面来&#xff0c;不用说&#xff0c;先来看安装软件&#xff01; System-Administation-添加…

公务员级别分类

公务员领导职务层次与级别的对应关系 (一)国家级正职&#xff1a;一级(二)国家级副职&#xff1a;四级至二级(三)省部级正职&#xff1a;八级至四级(四)省部级副职&#xff1a;十级至六级(五)厅局级正职&#xff1a;十三级至八级(六)厅局级副职&#xff1a;十五级至十级(七)县处…