TextView在Swift中处理大量字符

TextView在Swift中处理大量字符,swift,performance,textview,Swift,Performance,Textview,我正在开发一个包含文本视图和一些按钮的应用程序,它根据光标位置进行一些计算。它包含for循环和数组以及一个字符串扩展名,用于获取游标后面/前面的字符,并从中添加或删除。它运行平稳,只有500个字符或更少,但超过500个字符时,它在添加到textView或从textView中删除时开始变慢,超过1000个字符时,它变得难以处理。我已经用iPhone6sPlus和iPadPro 2nd 12英寸对它进行了测试,在Xcode模拟器中,它对所有这些设备的作用完全相同,所以我认为这不是硬件限制 下面是一些

我正在开发一个包含文本视图和一些按钮的应用程序,它根据光标位置进行一些计算。它包含for循环和数组以及一个字符串扩展名,用于获取游标后面/前面的字符,并从中添加或删除。它运行平稳,只有500个字符或更少,但超过500个字符时,它在添加到textView或从textView中删除时开始变慢,超过1000个字符时,它变得难以处理。我已经用iPhone6sPlus和iPadPro 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()
        }
    }
}

我正在使用的扩展

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])
  }  
}
extension String.UnicodeScalarView{
变量长度:Int{
返回计数
}
下标(i:Int)->字符串{
返回自我[i..字符串{
返回自我[Swift.min(fromIndex,length)…字符串{
返回自[0..字符串{
让范围=范围(未选中边界:(下:Swift.max(0,Swift.min(长度,r.lowerBound)),
上限:Swift.min(长度,Swift.max(0,r.上限)))
让开始=索引(开始索引,偏移量:range.lowerBound)
让结束=索引(开始,偏移:range.upperBound-range.lowerBound)
返回字符串(self[start..
然后单击按钮时调用这些函数和其他函数


如果您知道如何提高速度,请提供帮助。

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

当我输入大量文本时,这个循环范围会变大(spaceCount…textView.text.count),因为它会获取textView中的字符数,所以只需将其更改为一个固定的数字,如:(spaceCount…50),就这样


谢谢

下次请不要重新发布。谢谢,我删除了上一篇文章,因为我知道获取代码示例需要一些时间,如果没有任何示例,那么将文章保留这么长时间是没有用的,所以我决定将其删除。谢谢你的评论。从使用仪器开始,看看是哪行代码导致了问题。
    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])
  }  
}
func skipSpace () {
for _ in  spaceCount...textView.text.count {
    if checkSpace() == false {
        nextChar()
    }
}