Swift里字符串的索引

在编程过程中,我们经常需要处理字符串。有时需要提取字符串的某一段,或某个字符。

一、问题描述

在大多数编程语言中,我们可以用索引值i,提取字符串中的第i个元素。如,在Python语言中,以下代码可以打印字符串里的索引值为2~4的字符:

python 复制代码
s = "I love you"
print(s[2:5])

但是,如果在Swift中,以下代码必然出错

swift 复制代码
var s = "I love you"
print(s[2...4])

程序甚至无法通过编译

复制代码
'subscript(_:)' is unavailable: cannot subscript String with an integer range, use a String.Index range instead.

二、问题分析

原因在于,Swift中,对字符串的索引,并不是简单的数字。

三、解决方案

但Swift中的字符串仍然可以提取索引,只是需要特定的函数和属性。

首先,对于任何一个字符串,都有两个索引值是不用函数,而用属性直接获得的。一个是起始索引,即字符串的0号索引;一个是末尾索引,即字符串的最后一个字符的索引的后一个。两个索引分别为s.startIndexs.endIndex

要提取字符串的第一个字符,即0号字符,只需运行:

swift 复制代码
print(s[s.startIndex])

结果是:

复制代码
I

那么,如何提取最后一个字符呢?这么写的话:

swift 复制代码
print(s[s.endIndex])

必然会出错:

复制代码
String index is out of bounds

刚才已经说到,s.endIndex是最后一个字符的索引的后一个 。所以这个索引已经超出了字符串的索引范围。那我们就要做些计算,在一个已知的索引的基础上退回一步。字符串有一个方法(即函数)可以做这样的前进后退计算:s.index(s.endIndex, offsetBy: -1)

这个函数里,第一个参数是基准索引,而offsetBy输入参数是前进/后退的步数。-1就是后退一步。现在再运行以下程序:

swift 复制代码
print(s[s.index(s.endIndex, offsetBy: -1)])

输出结果:

复制代码
u

所以这样的话,想找第3个字符,索引值就是s.index(s.startIndex, offsetBy: 2)

那么,回到最初的问题:要找索引值为2~4的字符,怎么写?

答案是:

swift 复制代码
print(s[s.index(s.startIndex, offsetBy: 2) ... s.index(s.startIndex, offsetBy: 4)])

输出结果

复制代码
lov
相关推荐
wifi___4 小时前
全局异常处理的原理
java·开发语言
平常心的技术小牛7 小时前
Qt-快速上手-QMenuBar
开发语言·qt
青 春 记 忆8 小时前
零基础入门Python11|Git实战:为任务管理器建立版本历史
开发语言·git·vscode·python·python3.11
余额瞒着我当琳9 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
坐吃山猪10 小时前
WebClient内存配置解析
开发语言·springboot·webflux
jdksjw10 小时前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠10 小时前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek
SL-staff11 小时前
技术实践:HR如何用JVS-Logic可视化编排实现考勤数据同步(含节点配置与异常处理)
开发语言·python·低代码·钉钉·可视化编排·jvs-logic·hr技术
SomeB1oody11 小时前
【RustyML入门】6.0. 数学工具
开发语言·后端·机器学习·rust·教程
进制树12 小时前
【飞控开发实战·⑲】ROS2无人机开发环境搭建:Jazzy安装、工作空间与hello_drone节点实战
开发语言·安全·无人机·课程设计