有時候想對字符串進(jìn)行某些特殊操作,需要獲取NSRange,比如富文本...
下面簡單在String上進(jìn)行擴(kuò)展,方便使用...
extension String {
/// 字符串的匹配范圍 方法一
///
/// - Parameters:
/// - matchStr: 要匹配的字符串
/// - Returns: 返回所有字符串范圍
func exMatchStrRange(matchStr: String) -> [NSRange] {
var allLocation = [Int]() //所有起點
let matchStrLength = (matchStr as NSString).length //currStr.characters.count 不能正確統(tǒng)計表情
let arrayStr = self.componentsSeparatedByString(matchStr)
var currLoc = 0
arrayStr.forEach { currStr in
currLoc += (currStr as NSString).length
allLocation.append(currLoc)
currLoc += matchStrLength
}
allLocation.removeLast()
return allLocation.map { NSRange(location: $0, length: matchStrLength) } //可把這段放在循環(huán)體里面,同步處理,減少再次遍歷的耗時
}
/// 字符串的匹配范圍 方法二(推薦)
///
/// - Parameters:
/// - matchStr: 要匹配的字符串
/// - Returns: 返回所有字符串范圍
func exMatchStrNSRange(matchStr: String) -> [NSRange] {
var selfStr = self as NSString
var withStr = Array(count: (matchStr as NSString).length, repeatedValue: "X").joinWithSeparator("") //輔助字符串
if matchStr == withStr { withStr = withStr.lowercaseString } //臨時處理輔助字符串差錯
var allRange = [NSRange]()
while selfStr.rangeOfString(matchStr).location != NSNotFound {
let range = selfStr.rangeOfString(matchStr)
allRange.append(NSRange(location: range.location,length: range.length))
selfStr = selfStr.stringByReplacingCharactersInRange(NSMakeRange(range.location, range.length), withString: withStr)
}
return allRange
}
}
let str = "吾生也有涯而知也無涯,以有涯隨無涯殆己"
let allRange1 = str.exMatchStrRange("無涯")
let allRange2 = str.exMatchStrNSRange("涯")
print(allRange1) // [(8,2), (15,2)]
print(allRange2) // [(4,1), (9,1), (13,1), (16,1)]
富文本使用例子:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let str = "吾生也有涯,而知也無涯。\n以有涯隨無涯,殆已!\n已而為知者,殆而已矣!"
let attributeString = NSMutableAttributedString(string: str)
let allRange1 = str.exMatchStrRange("無涯")
let allRange2 = str.exMatchStrRange("吾生")
let allRange3 = str.exMatchStrRange("殆已")
allRange1.forEach {
attributeString.addAttribute(NSForegroundColorAttributeName, value: UIColor.orangeColor(), range: $0)
attributeString.addAttribute(NSFontAttributeName, value: UIFont(name: "HelveticaNeue-Bold", size: 16)!,range: $0)
}
allRange2.forEach {
attributeString.addAttribute(NSFontAttributeName, value: UIFont(name: "HelveticaNeue-Bold", size: 18)!,range: $0)
}
allRange3.forEach {
attributeString.addAttribute(NSBackgroundColorAttributeName, value: UIColor.redColor(),
range: $0)
}
label.attributedText = attributeString
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。