Я работаю над приложением, которое содержит textView и несколько кнопок, оно выполняет некоторые вычисления на основе позиции курсора. Он содержит циклы и массивы и расширение String для получения символа после / до курсора и добавления или удаления из него. Он работает плавно с 500 символами или менее, но более того он начинает медленно добавляться или удаляться из textView, а с более чем 1000 символов становится невыносимо работать. Я протестировал его на iPhone 6s Plus и iPad Pro 2nd 12-дюймовый, и в симуляторе Xcode он работает точно так же со всеми этими устройствами, поэтому я не думаю, что это аппаратное ограничение.
Вот несколько примеров кода:
func checkLetter () {
let nextOne = textView.text.unicodeScalars[getCursorPosition()]
let nextTwo = textView.text.unicodeScalars[getCursorPosition()+1]
let nextThree = textView.text.unicodeScalars[getCursorPosition()+2]
let testLetter = ["ّ","ْ","ٌ","ُ","ٍ","ِ","ً","َ"]
for b in 0...7 {
if nextThree == testLetter[b] && nextTwo == "ّ" {
print ("Next Three!")
nextChar()
nextChar()
delLetter()
delLetter()
preChar()
}else if nextThree == testLetter[b] && nextTwo == testLetter[b] {
print ("Next Three!")
nextChar()
nextChar()
nextChar()
delLetter()
delLetter()
preChar()
}else if nextTwo == testLetter[b] {
print ("Next Two!")
nextChar()
nextChar()
delLetter()
preChar()
}else if nextOne == testLetter[b] {
print ("Next One!")
nextChar()
delLetter()
preChar()
}
}
}
.
func preChar () {
// only if there is a currently selected range
if let selectedRange = textView.selectedTextRange {
// and only if the new position is valid
if let newPosition = textView.position(from: selectedRange.start, offset: -1) {
// set the new position
textView.selectedTextRange = textView.textRange(from: newPosition, to: newPosition)
}
}
}
.
func skipSpace () {
for _ in spaceCount...textView.text.count {
if checkSpace() == false {
nextChar()
}
}
}
Расширение, которое я использую
extension String.UnicodeScalarView {
var length: Int {
return count
}
subscript (i: Int) -> String {
return self[i ..< i + 1]
}
func substring(fromIndex: Int) -> String {
return self[Swift.min(fromIndex, length) ..< length]
}
func substring(toIndex: Int) -> String {
return self[0 ..< Swift.max(0, toIndex)]
}
subscript (r: Range<Int>) -> String {
let range = Range(uncheckedBounds: (lower: Swift.max(0, Swift.min(length, r.lowerBound)),
upper: Swift.min(length, Swift.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])
}
}
Затем эти и другие функции вызываются при нажатии кнопки.
Пожалуйста, помогите, если вы знаете, как я могу улучшить скорость.