Swift: String 字符串截取封装

Swift 中 String 字符串截取需要使用 String.Index 来确定要截取的范围,如下面的例子:

我要在字符串 alphabet 中截取索引为 3到6(包含6)的子字符串,我需要先构造出 String.Index 类型的起始索引(beginIndex)与结束索引(endIndex)。然后通过起始索引与结束索引构建一个 CloseRange 类型的参数,以下标的形式去获取alphabet 的子字符串。

let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
let beginIndex = alphabet.index(alphabet.startIndex, offsetBy: 3)
let endIndex = alphabet.index(alphabet.startIndex, offsetBy: 6)
let subString = alphabet[beginIndex...endIndex]
print(subString)

上述的方式虽然完成了我的需求但是,代码过于复杂,我就是为了获取索引为 3到6(包含6)的子字符串,但却写了上面一大堆的代码。理想的方式是我通过数字(Int)索引就可以截取到我想要的子字符串,就像这样 alphabet[3...6]

为了实现这种快速简单的 String 截取方法,我对 String 类型做了下面的简单扩展。

extension String {
    subscript(_ indexs: ClosedRange) -> String {
        let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
        let endIndex = index(startIndex, offsetBy: indexs.upperBound)
        return String(self[beginIndex...endIndex])
    }
    
    subscript(_ indexs: Range) -> String {
        let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
        let endIndex = index(startIndex, offsetBy: indexs.upperBound)
        return String(self[beginIndex..) -> String {
        let endIndex = index(startIndex, offsetBy: indexs.upperBound)
        return String(self[startIndex...endIndex])
    }
    
    subscript(_ indexs: PartialRangeFrom) -> String {
        let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
        return String(self[beginIndex..) -> String {
        let endIndex = index(startIndex, offsetBy: indexs.upperBound)
        return String(self[startIndex..

然后就可以使用下面的这种简单的方式截取字符串了

let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print(alphabet[..<4])  // ABCD
print(alphabet[...4])  // ABCDE
print(alphabet[5..<10]) // FGHIJ
print(alphabet[5...10]) // FGHIJK
print(alphabet[11...])  // LMNOPQRSTUVWXYZ

你可能感兴趣的:(Swift: String 字符串截取封装)