Swift 中对 String 类型的 substring() 方法都被标记为不推荐(deprecated)了,那该如何实现 substring 的功能呢?

substring is deprecated

根据Xcode的提示可以使用slicing(切片)的方式来实现substring的功能

以字符串 let str = "0123456789" 为例:

从开始到第一个等于5的字符之前的子串:

1
2
3
4
5
if let firstFive = str.firstIndex(of: "5") {
    let substr = str[str.startIndex..<firstFive] // substr = 01234
    // 或者可以省略开始的index
    let substr2 = str[..<firstFive] // substr2 = 01234
}

从开头到第一个等于5的字符

1
let substr = str[...firstFive] // substr = 012345

从第一个5开始到字符串末尾

1
let substr = str[firstFive...] // 56789

前7个字符

1
let strstr = str[str.startIndex..<str.index(str.startIndex, offsetBy: 7)] // 0123456

String切片后返回的结果类型是 Substring

struct Substring

Substring 不会为字符串额外分配空间,而是与原始字符串共享存储。

划重点: 因为Substring会持有对原始字符存储的引用计数,所以要确保子串的生命周期不长于源字符串的生命周期,以免内存泄漏。


Ref: https://swiftunboxed.com/stdlib/substrings