【Swift】String与Sbustring区别与联系

news2024/11/29 14:55:02
  • String 还是字符串,始终如一。
  • Substring 是string的切片。它们与base string共享内存buffer,并拥有一对范围索引。
  • StringProtocol 抽取出字符串的特征以及如何访问其功能,放进一个协议中。StringSubstring都遵循StringProtocol

img

字符串在不同的 Swift 版本中变化比较大。在 Swift 4 中,当需要从一个字符串中获取子串时,我们获取到的是 Substring 类型而不是一个 String 类型的值。为什么会这样?在 Swift 中,字符串是值类型。这意味着如果想从一个字符串中生成一个新的字符串,则需要做拷贝处理。这对于稳定性是有益的,但效率却不高。

从另一方面讲,一个 Substring 则是对其原始 String 的一个引用。它不需要做拷贝操作,所以更加高效。但是有另一个问题,假设我们要从一个很长的字符串中获取一个长度为 10 的 Substring,由于这个 Substring 会引用 String,那么只要 Substring 一直存在,String 就必须一直存在。所以,任何时候当处理完 Substring 后,需要将其转换为 String。

let myString = String(mySubstring)

这样只会拷贝子串,而原来的字符串可以被正确地回收。Substring 作为一种类型,本身即表示临时存在的。

在 Swift 4 另一个大的改进是字符串又成为集合了。这意味着在集合上的所有操作,也可以应用在字符串中(如下标、迭代字符、过滤等)。

Substring内部

substring的一部分魔法是重用了“parent” string的内存。你可以认为substring由base stringrange构成。

img

这意味着从一个8000字符的string上切一个100字符的substring不需要分配额外内存,也不用复制100个字符。

这也意味着你可能无意延长了你的base string的生命周期。如果你有一个超大字符串存了一整本小说,然后从其中切片了一个单词,那么只要substring还在,这个巨大的string就会一直阴魂不散。

那么到底substring内部是如何跟踪这些的呢?

public struct Substring {
  internal var _slice: RangeReplaceableBidirectionalSlice<String>

内部的 _slice属性保存了关于base string的所有信息:

// 仍然是 Substring 的代码
internal var _wholeString: String {
  return _slice._base
}
public var startIndex: Index { return _slice.startIndex }
public var endIndex: Index { return _slice.endIndex }

计算属性 _wholeString(返回原来完整的字符串),以及 startIndexendIndex (指出在string中切片的范围)只是简单的传递了内部切片属性的值。

你也能看到切片如何用 _base来保存原始string的信息。

参考:
https://www.jianshu.com/p/90adf8ce7b9a

https://blog.csdn.net/weixin_34054931/article/details/87979393

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

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

相关文章

从零开始学习机器学习和深度学习:基础知识、编程工具和实践经验

当涉及到机器学习和深度学习时&#xff0c;许多人可能感到不知所措。本文将为您提供入门机器学习和深度学习的基础知识。 什么是机器学习&#xff1f; 机器学习是人工智能的一个分支&#xff0c;其主要目的是通过训练算法来实现任务&#xff0c;而不是手动编程来实现任务。机器…

MySQL原理(二):逻辑架构和执行流程

前言 上一篇介绍了 MySQL 默认的 InnoDB 存储引擎是如何存储和组织数据的&#xff0c;这一篇将介绍 MySQL 的逻辑架构&#xff0c;以及分析一条 SQL 语句的具体执行过程。 逻辑架构 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层。 Server 层负责建立连接、分析…

HiEV独家 | 比亚迪高阶智驾终于来了 ,新款汉首发,多车型将搭载

作者 | 德新 编辑 | 马波 比亚迪上马高阶辅助驾驶&#xff0c;首先从高速NOA开始。 HiEV获悉&#xff0c;今年第三季度&#xff0c;比亚迪将在新的 汉车型 上&#xff0c;搭载高速领航辅助驾驶功能&#xff08;俗称高速NOA&#xff09;。继汉之后&#xff0c;王朝系列唐…

【神经网络】tensorflow实验10 -- 人工神经网络(1)

1. 实验目的 ①理解并掌握误差反向传播算法&#xff1b; ②能够使用单层和多层神经网络&#xff0c;完成多分类任务&#xff1b; ③了解常用的激活函数。 2. 实验内容 ①设计单层和多层神经网络结构&#xff0c;并使用TensorFlow建立模型&#xff0c;完成多分类任务&#xf…

Packet Tracer - 第 2 层安全

Packet Tracer - 第 2 层安全 目标 将 Central 交换机指定为根网桥。 保护生成树参数的安全&#xff0c;以防止 STP 恶意操纵 攻击。 启用端口安全以防御 CAM 表泛洪攻击。 拓扑图 背景/ 场景 最近网络遭到了一些 攻击。出于此原因&#xff0c;网络管…

2022年平均工资揭晓!2022年IT行业平均工资超高!最赚钱的行业是......IT! 看看最赚钱的职位是什么?

2022年平均工资发布&#xff01;最赚钱的行业是…IT 文章目录 2022年平均工资发布&#xff01;最赚钱的行业是......IT2022年城镇非私营单位就业人员年平均工资按区域、行业门类、登记注册类型分组的城镇非私营单位就业人员年平均工资&#xff1a; 附注&#xff1a;2022年城镇私…

为AIGC敲响警钟!千亿级赛道为何成了作恶温床?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 随着人工智能通用大模型的问世&#xff0c;全球对AIGC技术的强大潜力有了更加深刻的认识。然而&#xff0c;这也引发了诸多关于AIGC技术可信度、隐私保护以及知识产权等问题的争议&#xff0c;引起了广泛关注。 5月9日&…

Windows安装两个MySQL【5.7 + 8.0】

目录 1、下载MySQL82、解压、放置3、配置3-1 添加环境变量3-2 配置文件 my.ini3-3 配置 MySQL 服务3-4 root 通过IP访问 4、连接 ✨ 已安装 MySQL5&#xff0c;再加装MySQL8 1、下载MySQL8 https://dev.mysql.com/downloads/mysql/ MySQL :: Download MySQL Community Server…

VScode 中运行C++,并用g++命令、CMake、配置launch.josn和tasks.json来运行和调试可执行文件

前期安装准备 安装VScode、cmake、mingw32 &#xff08;具体版本如下&#xff09; VSCodeUserSetup-x64-1.78.0.exe cmake-3.26.3-windows-x86_64.msi x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 将这几个的bin目录加入系统环境变量&#xff08;右击此电脑&#xff0c…

Java基础之ConcurrentHashMap答非所问

ConcurrentHashMap的数据结构是什么&#xff1f; ConcurrentHashMap仅仅是HashMap的线程安全版本&#xff0c;针对HashMap的线程安全优化&#xff0c;所以HashMap有的特点ConcurrentHashMap同意具有&#xff0c; ConcurrentHashMap的数据结构跟HashMap是一样的。 在JDK7版本使用…

中学理化生实验室建设及配置要求

中学理化生实验室是中学阶段进行物理、化学、生物教学和研究的场所。其可以满足实验教学要求,实验室提供必要的仪器、设备、工具、材料等课程资源&#xff0c;方便学生熟悉并接触一些实验仪器设备&#xff0c;学习掌握基本实验技能。同时&#xff0c;实验室科学合理的方案配置&…

MySQL原理(十):主从架构

前言 上一篇介绍了 MySQL 的表分区和分库分表&#xff0c;这一篇将介绍主从架构相关的内容。 主从架构 常见的主从架构模式有四种&#xff1a; 一主多从架构&#xff1a;适用于读大于写的场景&#xff0c;采用多个从库来分担数据库系统的读压力。多主架构&#xff1a;适用于…

康希诺生物:新冠疫苗影响当期业绩,毛利润减少89.92%

来源;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;由于4月28日&#xff0c;康希诺生物&#xff08;06185&#xff09;发布2023年一季度报告&#xff0c;收入同比下滑及利润端亏损&#xff0c;主要由于新冠疫苗需求量同比大幅下降&#xff0c;以及产品价格调整…

在 IDEA 中创建 Java Web 项目的方式(详细步骤教程)

开发环境 以下是我的开发环境 JDK 1.8Maven 3.6.3Tomcat 9.0IDEA 2019&#xff08;2019 无所畏惧&#xff0c;即使现在已经 2023 年了哈哈哈&#xff09; 最原始的 Java Web 项目 下面的内容可能会因 IDEA 版本不同&#xff0c;而有些选项不同&#xff0c;但是大同小异。 …

【上进小菜猪】使用Ambari提高Hadoop集群管理和开发效率:提高大数据应用部署和管理效率的利器

&#x1f4ec;&#x1f4ec;我是上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货&#xff0c;欢迎关注。 介绍 Hadoop是一种开源的分布式处理框架&#xff0c;用于在一组低成本硬件的集群上存储和处理大规模数据集。Ambari是一种基…

python 获取cookie的方法

在 Web应用程序中&#xff0c;用户访问网站时&#xff0c;通常会请求访问服务器上保存的一些用户信息&#xff08;例如&#xff1a; Cookie&#xff09;&#xff0c;这些信息包含了用户的一些个人信息&#xff0c;比如&#xff1a;姓名、地址、密码等。对于用户来说&#xff0c…

目标检测YOLO实战应用案例100讲-基于YOLOv3的目标检测研究及改进(论文篇)

知识拓展 多尺度特征学习 目前深度学习用于目标检测已经习以为常。从SSD到Yolo系列,其中: 深层网络的感受野比较大,语义信息表征能力强,但是特征图的分辨率低,几何信息的表征能力弱(空间几何特征细节缺乏); 低层网络的感受野比较小,几何细节信息表征能力强,虽然分辨…

国漫画江湖之不良人6真的封神!

国漫画江湖之不良人6真的封神&#xff01; 今天不良人第六季大结局&#xff0c;真的超好看&#xff0c;不仅剧情完整&#xff0c;而且还非常甜&#xff0c;看的非常爽&#xff0c;时长直接拉到40分钟&#xff0c;打斗场面刺激&#xff0c;简直是语言形容不出来的爽&#xff01…

[PyTorch]Onnx模型格式的转换与应用

相较于PyTorch默认的模型存储格式pth而言&#xff0c;onnx具有多端通用&#xff0c;方便部署的优点&#xff08;据称能加快推理速度&#xff0c;但是未验证&#xff09;&#xff0c;本文将介绍如何使用onnx并将原有的pth权重转换为onnx。 一、配置环境 在控制台中使用如下指令 …

【wordpress】管理员忘记密码? 三种方法找回

随着近年来网络攻击日趋频繁&#xff0c;我们在网站中所设置的各种密码也变得越来越复杂&#xff0c;wordpress现在也可以生成非常复杂的密码&#xff0c;以防止被暴力破解。 但这些复杂的密码一般是无法记住的&#xff0c;我们会将此存放在我们的记事本中 如果我们的记事本遗…