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