Swift 中如何缩短 Range<String.Index> 的长度
今天写一个小项目的时候遇到一个这样的需求,截取一个类似 Michael: Hello, World!
的字符串中的名字部分,当然,代码如下:
// Note: You have to import Foundation in Playground
let rawString = "Michael: Hello, World!"
let range = rawString.rangeOfString("^\\w{0,10}:", options: .RegularExpressionSearch)
if (range != nil) {
println(rawString.substringWithRange(range!))
}
// Output:
// Michael:
那么,这个 range
的长度如何减少1呢?
这里的 range
的类型是 Range<String.Index>
,它无法直接减1,下面的做法是错误的:
range! - 1
range!.endIndex - 1
Range<SomeTypes>.startIndex
或者 Range<SomeTypes>.endIndex
有 predecessor()
和 successor()
方法,分别为 向前 和 向后一位。这样,我们的需求就可以实现了:if (range != nil) {
let subRange = Range<String.Index>(start: range!.startIndex, end: range!.endIndex.predecessor())
// 这一行可以简写为:
let subRange2 = range!.startIndex ..< range!.endIndex.predecessor()
println(rawString!.substringWithRange(subRange))
}
// Output:
// Michael
每次都需要调用
predecessor()
和 successor()
挺麻烦,但是这种需求可以通过重载操作符实现类似 range!.endIndex - 1
的效果,这个坑等以后再填吧。