现有字符串Hello, World!
let helloWorld = "Hello, World!"
想截取前5个字符为子串,有两种方法,一是使用字符串的集合特性:
let subStringTo5 = String(helloWorld.prefix(5))
二是使用字符串索引:
let subStringTo5 = String(helloWorld[..<helloWorld.index(helloWorld.startIndex, offsetBy: 5)])
print("subStringTo5: \(subStringTo5)")
打印结果:
subStringTo5: Hello
要对String操作,大多需要通过String.Index为中间媒介来达到。
对于截取字符串,Swift4用的是[startIndex...endIndex]
这样的语法,在String后跟一个区间。通俗讲,此区间的值要求用String.Index类型,下面我们来弄出一些Index值。
起始Index:
let startIndex = helloWorld.startIndex
在起始Index基础上偏移5:
let offset5Index = helloWorld.index(startIndex, offsetBy: 5)
在中括号里写两个值,可以得到一个子串,结果是SubString类型。
这种写法...
是闭区间,得到结果包括左右两个Index对应的字符;
这种写法..<
是开区间,得到结果包括了左Index对应的字符,但不包括右Index对应的字符:
let subString = helloWorld[startIndex..<offset5Index]
如果左Index不写,则默认为startIndex:
let subString = helloWorld[..<offset5Index]
以上得到的结果,类型还不是String,只是SubString类型而已,还需要我们多做一步工作,构造String :
let subStringTo5 = String(helloWorld[..<offset5Index])
print("subStringTo5: \(subStringTo5)")
打印结果:
subStringTo5: Hello
如果在中括号里只写一个Index值会怎么样?得到的结果是所写Index对应的字符,Character类型:
let offset5Character = helloWorld[offset5Index]
print("offset5Character: \(offset5Character)")
打印结果,是个逗号:
offset5Character: ,
如果觉得Swift4这样设计,不习惯,那么还是可以通过extension的方式,自己实现一个喜欢的subString方法。
extension String {
func mySubString(to index: Int) -> String {
return String(self[..<self.index(self.startIndex, offsetBy: index)])
}
func mySubString(from index: Int) -> String {
return String(self[self.index(self.startIndex, offsetBy: index)...])
}
}
使用:
print("subStringTo8: \(helloWorld.mySubString(to: 8))")
print("subStringFrom5: \(helloWorld.mySubString(from: 5))")
打印结果:
subStringTo8: Hello, W
subStringFrom5: , World!