我有一个512个字符长的字符串,我需要在循环中打印16个字符长的部分。
例如,字符1-16,然后是2-17,然后是3-18等。
我能找到打印子字符串的唯一方法是使用substringWithRange
生成我想要的子字符串。但是每次都会分配一个新的字符串,这会碰到堆并导致我性能不佳。
如何在不创建新字符串的情况下打印子字符串?
答案 0 :(得分:2)
为字符串中的下标范围创建扩展名:
extension String {
subscript (i: Int) -> Character {
return self[self.startIndex.advancedBy(i)]
}
subscript (i: Int) -> String {
return String(self[i] as Character)
}
subscript (r: Range<Int>) -> String {
let start = startIndex.advancedBy(r.startIndex)
let end = start.advancedBy(r.endIndex - r.startIndex)
//return self[Range(start: start, end: end)] // Deprecated in Swift 2.x
return self[Range(start ..< end)] // Swift 3
}
}
归功于this answer的作者 aleclarson 。
然后,如果您需要以16个字符的块打印字符串,请执行以下操作:
var start = 0
var end = 15
while end < 512 {
print(yourString[start...end])
start += 16
end += 16
}
虽然我建议使用yourString.characters.count
检查字符串是否实际为512个字符,或者只是将最大索引设置为字符串的字符数。