Swift String.Index 字符串的切片操作
需求
在Swift中字符串的相关操作再也不是Int类型,而是String.Index。虽然不知道官方为什么这样设计,但是在开发的时候,使用起来,确实是不好看,而且让代码看起来不简洁。因此,为了方便以后的使用,就简单的封装一下,方便我们日常开发需求。
实现
在Swift中,对字符串的操作,其实跟OC差不多,但是参数都是String.Index,这个让我们写起来就很不舒服了。 话不多说,直接上代码:
extension String{ //MARK:-返回string的长度 var length:Int{ get { return self.characters.count; } } //MARK:-截取字符串从开始到 index func substring(to index: Int) -> String { guard let end_Index = validEndIndex(original: index) else { return self; } return String(self[startIndex..<end_Index]); } //MARK:-截取字符串从index到结束 func substring(from index: Int) -> String { guard let start_index = validStartIndex(original: index) else { return self } return String(self[start_index..<endIndex]) } //MARK:-切割字符串(区间范围 前闭后开) func sliceString(_ range:CountableRange<Int>)->String{ guard let startIndex = validStartIndex(original: range.lowerBound), let endIndex = validEndIndex(original: range.upperBound), startIndex <= endIndex else { return "" } return String(self[startIndex..<endIndex]) } //MARK:-切割字符串(区间范围 前闭后闭) func sliceString(_ range:CountableClosedRange<Int>)->String{ guard let start_Index = validStartIndex(original: range.lowerBound), let end_Index = validEndIndex(original: range.upperBound), startIndex <= endIndex else { return "" } if(endIndex.encodedOffset <= end_Index.encodedOffset){ return String(self[start_Index..<endIndex]) } return String(self[start_Index...end_Index]) } //MARK:-校验字符串位置 是否合理,并返回String.Index private func validIndex(original: Int) -> String.Index { switch original { case ...startIndex.encodedOffset : return startIndex case endIndex.encodedOffset... : return endIndex default : return index(startIndex, offsetBy: original) } } //MARK:-校验是否是合法的起始位置 private func validStartIndex(original: Int) -> String.Index? { guard original <= endIndex.encodedOffset else { return nil } return validIndex(original:original) } //MARK:-校验是否是合法的结束位置 private func validEndIndex(original: Int) -> String.Index? { guard original >= startIndex.encodedOffset else { return nil } return validIndex(original:original) } }
调用示例
LLog("1231232".sliceString(2..<6)) LLog("1231232".sliceString(-1...6)) LLog("12".substring(to: 5)) LLog("asdas212asdasd".substring(from: 1))