超好用的Swift 4.0 字元擷取快速便捷方法

NDaoxS發表於2018-01-23

這篇文章給大家分享一個基於Swift4.0的超便捷字串擷取方法。

文章涉及的程式碼有些是引用自以前在stackoverflow上看到的幾個問題的回答,不過問題包含什麼關鍵詞忘了,所以沒有在這貼上連線,在此給那些熱心回答的朋友們說句抱歉和謝謝。

——原生方法——

Swift的字串擷取並不能直接通過下標設定起始和結尾位置,通常比較繁瑣。比如像下面這樣子

let str = "Hello, world!"
let index = str.index(str.startIndex, offsetBy: 4)
str[index] // 返回字元 'o'

let endIndex = str.index(str.endIndex, offsetBy:-2)
str[index ..< endIndex] // 返回 字串 "o, worl"

String(str.suffix(from: index)) // 返回 字串 "o, world!"
String(str.prefix(upTo: index)) // 返回 字串 "Hell"
複製程式碼

不過僅僅是取不包含結尾的內容還是很方便的

——實現效果——

Int下標來實現字串擷取

let str = "abcdef"
str[1 ..< 3] // 返回 "bc"
str[5] // 返回 "f"
str[80] // 返回 ""
str.substring(fromIndex: 3) // 返回 "def"
str.substring(toIndex: str.length - 2) // 返回 "abcd"
複製程式碼

——需要複製去用的程式碼——

通過一個擴充套件實現

// 下標擷取任意位置的便捷方法
extension String {

    var length: Int {
        return self.characters.count
    }

    subscript (i: Int) -> String {
        return self[i ..< i + 1]
    }

    func substring(fromIndex: Int) -> String {
        return self[min(fromIndex, length) ..< length]
    }

    func substring(toIndex: Int) -> String {
        return self[0 ..< max(0, toIndex)]
    }

    subscript (r: Range<Int>) -> String {
        let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)), upper: min(length, max(0, r.upperBound))))
        let start = index(startIndex, offsetBy: range.lowerBound)
        let end = index(start, offsetBy: range.upperBound - range.lowerBound)
        return String(self[start ..< end])
}

}
//不包含後幾個字串的方法
extension String {
    func dropLast(_ n: Int = 1) -> String {
        return String(characters.dropLast(n))
    }
    var dropLast: String {
        return dropLast()
    }
}
複製程式碼

·

相關文章