引子

前几天在项目中需要截取字符串,却发现普适的语法在Swift里不适用

image-20200517002513483

看到提示说明我们需要使用String.Index的类型的变量

去文档里看看下标可以接收单个Index.....<三种

image-20200517003907575

果然是可以的

那么我们可以扩充下标方法来让我们更舒服的访问字符串,我这里返回值为可选性,以便不会越界

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
extension String {

subscript (i: Int) -> Character? {
guard i < self.count else {
return nil
}
return self[self.index(self.startIndex, offsetBy: i)]
}

subscript (r: Range<Int>) -> String? {
guard (r.lowerBound >= 0 && r.upperBound <= self.count) else { return nil }
let start = index(startIndex, offsetBy: r.lowerBound)
let end = index(startIndex, offsetBy: r.upperBound)
return String(self[start..<end])
}

subscript (r: ClosedRange<Int>) -> String? {
guard (r.lowerBound >= 0 && r.upperBound < self.count) else { return nil }
let start = index(startIndex, offsetBy: r.lowerBound)
let end = index(startIndex, offsetBy: r.upperBound)
return String(self[start...end])
}

}

之后就可以愉快地使用下标了

image-20200517122831148