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 小时前
JAVA中的一些基础应用知识点
java·开发语言
时间的拾荒人3 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
敲上瘾3 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
码途行者4 小时前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
旖旎夜光4 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
你看我名字5 小时前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
老秦包你会5 小时前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
旖旎夜光6 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
东坡肘子6 小时前
参与学生移动应用大赛有感 -- 肘子的 Swift 周报 #161
人工智能·swiftui·swift
Wang's Blog15 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友