Swift: String 字符串截取封装
2019-05-15 本文已影响0人
__Simon__
Swift 中 String
字符串截取需要使用 String.Index
来确定要截取的范围,如下面的例子:
我要在字符串 alphabet
中截取索引为 3到6(包含6)的子字符串,我需要先构造出 String.Index
类型的起始索引(beginIndex
)与结束索引(endIndex
)。然后通过起始索引与结束索引构建一个 CloseRange<String.Index>
类型的参数,以下标的形式去获取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<Int>) -> String {
let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
let endIndex = index(startIndex, offsetBy: indexs.upperBound)
return String(self[beginIndex...endIndex])
}
subscript(_ indexs: Range<Int>) -> String {
let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
let endIndex = index(startIndex, offsetBy: indexs.upperBound)
return String(self[beginIndex..<endIndex])
}
subscript(_ indexs: PartialRangeThrough<Int>) -> String {
let endIndex = index(startIndex, offsetBy: indexs.upperBound)
return String(self[startIndex...endIndex])
}
subscript(_ indexs: PartialRangeFrom<Int>) -> String {
let beginIndex = index(startIndex, offsetBy: indexs.lowerBound)
return String(self[beginIndex..<endIndex])
}
subscript(_ indexs: PartialRangeUpTo<Int>) -> String {
let endIndex = index(startIndex, offsetBy: indexs.upperBound)
return String(self[startIndex..<endIndex])
}
}
然后就可以使用下面的这种简单的方式截取字符串了
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