【问题标题】:How can I print a substring in Swift without creating a new string?如何在不创建新字符串的情况下在 Swift 中打印子字符串?
【发布时间】:2016-02-17 16:57:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果它在一个循环中,那么它不只是将相同的变量重新分配给新的子字符串吗?因此,在每次迭代中,您只需分配一个变量。除非我误解了您的描述,否则我认为这不会导致严重的性能问题。
  • “但这每次都会分配一个新字符串,这会碰到堆并导致我的性能不佳。”证明它。

标签: string swift substring


【解决方案1】:

为字符串中的下标范围创建扩展:

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

【讨论】:

  • 这不起作用:String 不能被 Range&lt;Int&gt; 下标
  • 查看我链接的答案。 (已修复,现在超链接直接指向我的意思的答案)
  • 您的答案似乎需要另一个答案的代码。您可以在您的答案中复制(全部/部分)这个其他答案(基于“答案应该能够独立存在”的想法)。唯一的条件是对另一位作者给予适当的归属并有一个链接(但我看到你已经有了这个链接)。当然,只是一个建议。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 2023-03-30
  • 1970-01-01
  • 2020-09-13
  • 2020-05-14
  • 2023-03-18
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多