前言
Swift里关于String的方法,着实要吐槽下,很多方法又臭又长又复杂(比如Index、Range等等),不实用,一些常用的方法,又没有现成的实现,平时习惯了Java里的String方法,开发Swift很不习惯(这里说明下,我主业是Java程序员,也开发Android程序,后来也开始开发iOS程序,好多思维习惯是Java带过来的,可能并不怪Swift,怪我咯,但是相信也有一部分朋友也有和我一样的感受,那么请看下面我的扩展方法),好在Swift里有Extension可以扩展自用的方法,这边整理了一下自用String扩展的方法(有length、indexOf、lastIndexOf、substring、replace等,都是Java里常用的string类方法)说明我写在注释里了
干货代码实现
import Foundation
extension String {
// 获得字符串的长度,其实就是swift的count方法,只不过我习惯了Java里的length方法
var length: Int {
get {
return self.count
}
}
/**
/* 下标用法 这样用:str[1...3] str[1..< 4]
*/
subscript(_ range: CountableRange<Int>) -> String {
let start = index(startIndex, offsetBy: max(0, range.lowerBound))
let end = index(start, offsetBy: min(self.count - range.lowerBound,
range.upperBound - range.lowerBound))
return String(self[start..<end])
}
subscript(_ range: CountablePartialRangeFrom<Int>) -> String {
let start = index(startIndex, offsetBy: max(0, range.lowerBound))
return String(self[start...])
}
subscript (_ r: CountableClosedRange<Int>) -> String {
let startIndex = self.index(self.startIndex, offsetBy: r.lowerBound)
let endIndex = self.index(startIndex, offsetBy: r.upperBound - r.lowerBound)
return String(self[startIndex...endIndex])
}
// 返回某个字符在字符串中出现的位置,返回-1表示没有出现
func indexOf(_ string: String) -> Int {
guard let index = range(of: string) else { return -1 }
return self.distance(from: self.startIndex, to: index.lowerBound)
}
// 从startIndex开始查找,返回某个字符在字符串中出现的位置,返回-1表示没有出现
func indexOf(target: String, startIndex: Int) -> Int {
let substring = self.substring(startIndex)
let idx = substring.indexOf(target)
if idx == -1 {
return -1
}
return idx + startIndex
}
// 返回某个字符在字符串中出现的位置(从末尾开始检查),返回-1表示没有出现
func lastIndexOf(_ string: String) -> Int {
guard let index = range(of: string, options: .backwards) else { return -1 }
return self.distance(from: self.startIndex, to: index.lowerBound)
}
// 返回从from开始的子字符串
func substring(_ from: Int) -> String {
let startIndex = self.index(self.startIndex, offsetBy: from)
return String(self[startIndex..<self.endIndex])
}
// 返回从from开始,到to结束的子字符串
func substring(from: Int, to: Int) -> String {
let startIndex = self.index(self.startIndex, offsetBy: from)
let endIndex = self.index(self.startIndex, offsetBy: to)
return String(self[startIndex..<endIndex])
}
// 检查本字符串是否全是数字
var containsOnlyDigits: Bool {
let notDigits = NSCharacterSet.decimalDigits.inverted
return rangeOfCharacter(from: notDigits, options: String.CompareOptions.literal, range: nil) == nil
}
// 检查本字符串是否全是字母
var containsOnlyLetters: Bool {
let notLetters = NSCharacterSet.letters.inverted
return rangeOfCharacter(from: notLetters, options: String.CompareOptions.literal, range: nil) == nil
}
// 替换字符串中含有target的替换为withString
func replace(target: String, withString: String) -> String {
return self.replacingOccurrences(of: target, with: withString, options: .literal, range: nil)
}
}
测试代码
let s = "hello world"
s.lastIndexOf("abc") // -1
s.indexOf("l") // 2
s.indexOf(target: "l", startIndex: 4) // 9
s.substring(from: 4, to: 5) // o
s.substring(3) // lo world
s.containsOnlyDigits // false
s.contains("or") // true
s.replace(target: "o", withString: "O") // hellO wOrld
文章评论