天天看點

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(..<))
  LLog("1231232".sliceString(-...))
  LLog("12".substring(to: ))
  LLog("asdas212asdasd".substring(from: ))
           
Swift String.Index 字元串的切片操作