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.startIndex和s.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
相关推荐
http阿拉丁神猫4 小时前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
不会就选b5 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
Pniubi8 小时前
HashMap的扩容和树化边界
java·开发语言
gCode Teacher 格码致知9 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工9 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留10 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu10 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
益莱储中国11 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
benchmark_cc12 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu12 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python