TextView 在 Swift 中处理大量字符

TextView handling lots of characters in Swift

我正在开发一个包含 textView 和一些按钮的应用程序,它会根据光标位置进行一些计算。它包含 for 循环和数组以及一个字符串扩展,用于获取字符 after/before 光标并从中添加或删除。它在 500 个或更少的字符时运行流畅,但超过 textView 时它开始变得缓慢,并且超过 1000 个字符时变得难以忍受。我用 iPhone 6s Plus 和 iPad Pro 2nd 12inch 测试过它,在 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])
  }  
}

然后在单击按钮时调用这些函数和其他函数。

如果你知道我怎样才能提高速度,请帮忙。

我已经修好了,现在速度快多了。这是 skipSpace() 方法。

func skipSpace () {
for _ in  spaceCount...textView.text.count {
    if checkSpace() == false {
        nextChar()
    }
}

当我键入大量文本时,此循环范围会变得很大 (spaceCount...textView.text.count) 因为它会获取 textView 中的字符数,所以只需将其更改为固定数字即可: (spaceCount...50),就是这样!

谢谢