一个实验性的包,用于探索如何改进 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])
尝试分配给无效索引仍然是一个致命错误。查看测试以了解您还可以做什么。