【问题标题】:How to crop file content string on string slices swift?如何在字符串切片上快速裁剪文件内容字符串?
【发布时间】:2021-01-24 05:08:59
【问题描述】:

我正在尝试在切片上裁剪字符串并将它们发送到服务器。举个例子:我有一个字符串大小为 813753 的文件。我必须在最大大小为 10000 的切片上裁剪它。以下所有代码都将在文件选择器函数中:

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        
        let file = urls[0]
        do{
            let fileData = try Data.init(contentsOf: file.absoluteURL)
            let encodedString = String.init(data: fileData, encoding: .isoLatin1)!
            let fileName = file.lastPathComponent
            let time = Int64(NSDate().timeIntervalSince1970)


}
}

选择后一开始我判断文件是否有分割结果>0:

let sliceCounts = encodedString.count%10000 > 0 ? encodedString.count/10000 + 1 :  encodedString.count/10000

然后在循环中我试图获取文件内容切片:

for slice in 0...sliceCounts{
    let partSize = slice*10000
                    
    let content = encodedString.count%10000 > 0 && partSize >= encodedString.count
                        ? substring(from: partSize - 10000, to: encodedString.count, s: 
       encodedString) : substring(from: partSize, to: partSize+10000, s: encodedString)



}

我使用这种方法获取文件部分:

func substring(from : Int, to : Int, s : String) -> String {
        let start = s.index(s.startIndex, offsetBy: from)
        let end   = s.index(s.startIndex, offsetBy: to)
        return String(s[start..<end])
    }

问题是我收到这样的错误:

Fatal error: String index is out of bounds: file Swift/StringCharacterView.swift, line 60

当我试图获取最后一个切片时会发生这种情况。我认为问题与这种情况有关:

encodedString.count%10000 > 0 && partSize >= encodedString.count

而且我认为由于错误,我可能在向我的方法发送索引时遇到了一些问题。也许有人会看到我在哪里犯了错误并会提供帮助:)

【问题讨论】:

    标签: ios swift string


    【解决方案1】:

    我在您的for 循环中发现了一些问题,首先您将一个迭代循环到很多,其次对于字符串的结尾,您需要考虑最后一个块可能更小。

    for slice in 0..<sliceCounts {
        let partSize = slice * maxSize
    
        let content: String
        if partSize + maxSize > encodedString.count {
            content = String(encodedString.suffix(encodedString.count - partSize))
        } else {
            content = encodedString.count%maxSize > 0 && partSize >= encodedString.count
                ? substring(from: partSize - maxSize, to: encodedString.count, s:
                                encodedString) : substring(from: partSize, to: partSize+maxSize, s: encodedString)
        }
    }
    

    请注意,我在代码中使用了常量 maxSize 而不是硬编码值

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多