使用 Swift 将字符串拆分为 64kb

Posted

技术标签:

【中文标题】使用 Swift 将字符串拆分为 64kb【英文标题】:Split string in 64kb using Swift 【发布时间】:2015-02-17 10:22:31 【问题描述】:

我想将一个非常大的字符串(最大为 8mb)分割成 64kb 的块。目前我正在使用以下代码:

//1
var regData:String= "string up to 8mb"
var count=((countElements(self.regData!))/65536)

//2
for var index = 0; index < count; ++index 
    arr.append(self.regData!.substringWithRange(Range<String.Index>(start: advance(self.regData!.startIndex, 0),end: advance(self.regData!.startIndex, 65536))))
    self.regData!.removeRange(Range<String.Index>(start: self.regData!.startIndex, end:advance(self.regData!.startIndex, 65536)))
    println(index)
 
//3
println("exit loop")
arr.append(self.regData!)
    我计算我有多少 64 kb 块。 在 for 循环中,我得到了第一个 64kb。我将它们收集在一个数组中。现在由于第 3 步,我必须删除前 64kb 字符串。 如果我的文件小于 64kb,我的循环中会出现错误。因此,我的最后一步是在循环之外。

代码运行良好,但速度极慢。我需要加快我的代码。你知道怎么做吗?

非常感谢。

【问题讨论】:

你不使用NSStream的原因是什么? 我是 ios 编程新手 :D... 我得看看 NSStream 【参考方案1】:

如果不修改原始字符串可能会更有效, 并且只需使用两个索引(fromto)来遍历字符串:

let regData = "string up to 8mb"
let chunkSize = 65536

var array = [String]()
var from = regData.startIndex // start of current chunk
let end = regData.endIndex    // end of string
while from != end 
    // advance "from" by "chunkSize", but not beyond "end":
    let to = from.advancedBy(chunkSize, limit: end)
    array.append(regData.substringWithRange(from ..< to))
    from = to

请注意,这给出了 65536 个字符的子字符串。自从斯威夫特 字符代表一个“Unicode 字形簇”,这不会 对应64kB的数据。如果你需要,那么你应该转换 NSData 的字符串并将其拆分为块。

(已针对 Swift 2 更新。)

【讨论】:

我会试试这个并给出反馈:D。谢谢 谢谢,这非常快 :D... 你能给我一个如何处理 NSStream 的例子吗?

以上是关于使用 Swift 将字符串拆分为 64kb的主要内容,如果未能解决你的问题,请参考以下文章

swift 按字符串将字符串拆分为数组

解码 JSON (Swift) 时将单个字符串拆分为多个部分

Swift - 在多行上拆分字符串

将字符串拆分为数组而不删除分隔符?

将字符串拆分为新列[重复]

关于如何在 Swift 中将字符串拆分为所需字符串数组的问题