在開發(fā)時(shí),我們經(jīng)常遇到限制一個(gè)字符串的長度,有時(shí)候會要求不超過N個(gè)字符,簡單封裝了下。
1. 計(jì)算字符串的字符數(shù)
extension String {
/// 字符數(shù)
var charactersCount: Int {
guard !isEmpty else { return 0 }
var bytesCount = count
let array = Array(self)
for i in 0..<count {
let charValue = array[i]
if let asciiValue = charValue.utf8.first {
if asciiValue < 0 || asciiValue > 127 {
bytesCount += 1
}
}
}
return bytesCount
}
}
2. 截取前N個(gè)字符
extension String {
/// 獲取前maxCharacterCount個(gè)字符對應(yīng)的字符串
/// - Parameter maxCharacterCount: 最大字符數(shù)
/// - Returns: 截取的字符串
func prefixText(with maxCharacterCount: Int) -> Self {
guard !isEmpty else { return "" }
var maxLength = maxCharacterCount
var subLength = 0
let array = Array(self)
for i in 0..<count {
let charValue = array[i]
maxLength -= 1
if let asciiValue = charValue.utf8.first {
if asciiValue < 0 || asciiValue > 127 {
maxLength -= 1
}
}
if maxLength < 0 {
break
} else {
subLength += 1
}
}
return Self(prefix(subLength))
}
}
3. 監(jiān)聽UITextField內(nèi)容變化,若字符數(shù)超出N個(gè),則截取前N個(gè)字符數(shù)
extension ViewController: UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
guard let text = textView.text.qjn_stringByTrim() else {
// do something
return
}
if let selectedRange = textView.markedTextRange, let pos = textView.position(from: selectedRange.start, offset: 0) {
return
}
DispatchQueue.global().async {
if text.charactersCount > N {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
textView.text = text.prefixText(with: N)
// do something
}
} else {
// do something
}
}
}
}