StringIndex - 对 Swift 字符串进行合理的索引

一个实验性的包,用于探索如何改进 Swift 中令人沮丧的字符串索引。目前,您必须执行以下令人难忘的操作才能获取 String 的第 5 个字符:

let fifthChar: Character = str[str.index(str.startIndex, offsetBy: 4)]

此包为 String.Index 类型定义了加法和减法运算符,返回一个临时枚举,该枚举传递偏移量和索引到 StringProtocol 上的下标运算符,该运算符会惰性地按偏移量前进(当它知道正在索引的字符串时)。结果是,您现在可以通过键入以下内容获得相同的结果:

let fifthChar: Character = str[.start+4]

还定义了范围运算符和下标,因此您可以使用以下方法删除字符串的开头和结尾字符,例如:

let trimmed: Substring = str[.start+1 ..< .end-1]

或者您可以在 String 中搜索另一个 String,并使用匹配的开头或结尾的索引:

let firstWord: Substring = str[..<(.first(of:" "))]
let lastWord: Substring = str[(.last(of: " ", end: true))...]

您可以搜索正则表达式模式:

let firstWord: Substring = str[..<(.first(of:#"\w+"#, regex: true, end: true))]
let lastWord: Substring = str[(.last(of: #"\w+"#, regex: true))...]

可以使用 + 运算符将字符串中的移动链接在一起:

let firstTwoWords = str[..<(.first(of:#"\w+"#, regex: true, end: true) +
                            .first(of:#"\w+"#, regex: true, end: true))]

要从这些表达式中实现 String.Index,请使用包中 String 上的 index(of:) 方法。

XCTAssertEqual(str.index(of: .start), str.startIndex)
XCTAssertEqual(str.index(of: .first(of: " ")), str.firstIndex(of: " "))

所有下标运算符都定义了 setter,因此您可以修改字符串内容。还有以标签 safe: 为前缀的下标,如果偏移导致无效索引,则可以返回 nil。

XCTAssertNil(str[safe: .start-1])
XCTAssertNil(str[safe: .end+1])

尝试分配给无效索引仍然是一个致命错误。查看测试以了解您还可以做什么。

$Date: 2025/01/07 $