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
相关推荐
落魄实习生2 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
茉莉玫瑰花茶2 小时前
GO [ 方法 ]
开发语言·后端·golang
狗凯之家源码网3 小时前
微博图床 PHP 系统搭建与实战应用指南
android·开发语言·php
乌暮4 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
2601_962218615 小时前
C语言中三种库的编译和使用方法
开发语言·c++
传奇开心果编程5 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
jimy15 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
_upupup6 小时前
异常(C++)
java·开发语言·jvm
霸道流氓气质6 小时前
ComfyUI 图像生成工作流完全指南:从节点编排到Java生产级图像生产实战
java·开发语言·人工智能
ShyanZh7 小时前
【Python3基础】13-Python 常用设计模式
开发语言·python·设计模式