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
相关推荐
CRMEB系统商城1 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience2 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao2 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
爱喝水的鱼丶3 小时前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv
脱胎换骨-军哥3 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
songroom3 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
kebeiovo4 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
迷途呀4 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
Herbert_hwt4 小时前
建立Java程序开发
java·开发语言
愚公移码5 小时前
蓝凌EKP18产品:流程虚拟机(PVM)
java·开发语言·前端