您的位置:首页 > 移动开发 > Swift

Swift String.Index 字符串的切片操作

2017-10-16 23:35 253 查看

需求

在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))


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: