在编程过程中,我们经常需要处理字符串。有时需要提取字符串的某一段,或某个字符。
一、问题描述
在大多数编程语言中,我们可以用索引值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