如何在不创建新字符串的情况下在Swift中打印子字符串?

时间:2016-02-17 16:57:44

标签: string swift substring

我有一个512个字符长的字符串,我需要在循环中打印16个字符长的部分。

例如,字符1-16,然后是2-17,然后是3-18等。

我能找到打印子字符串的唯一方法是使用substringWithRange生成我想要的子字符串。但是每次都会分配一个新的字符串,这会碰到堆并导致我性能不佳。

如何在不创建新字符串的情况下打印子字符串?

1 个答案:

答案 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个字符,或者只是将最大索引设置为字符串的字符数。