基本while循环中的索引超出范围

时间:2018-01-06 08:02:45

标签: ios swift while-loop indexoutofrangeexception

我正在解析HTML并重新格式化图像以适应。出于某种原因,我有多个图像要解析,我已经超出了范围,我无法弄清楚为什么会有我的生活。

当imgArray.count为> 1时,我正在循环使用带有递增计数器的标准while循环。

在一个例子中,imgArray计数为3,我是3,但是我的循环超出了范围,尽管我可以在multImgArray中看到适当的值,直到multImgArray [2]

如您所见,我在数组位置递减1以保持计数整数和数组位置同步

  if image {
    var imgArray = image.components(separatedBy: "style=")
    imgArray.removeFirst() //to remove unused portion of html

    var newImgArray = [String]()
    var multImgArray = [[String]]()

    if imgArray.isEmpty == false {
      if imgArray.count == 1 {
        newImgArray = imgArray[0].components(separatedBy: ">")
      } else {            
        var i = 0
        while i < imgArray.count {
          i+=1
          multImgArray.append(imgArray[i-1].components(separatedBy: ">"))
        }
      }

编辑:

原始HTML代码段

<p style="width:1000pt">

在循环之后,我应该为数组中的每个图像创建原始片段。但是循环超出范围,好像Xcode试图追加不存在的数组位置。

最终的预期输出(替换此处未显示的步骤,但根据其他请求添加以进行说明):

<p style="max-width:\(max-width)pt"> //where max-width is defined elsewhere as self.view.frame.width - 50

1 个答案:

答案 0 :(得分:0)

如果您遇到空字符串问题 - 可以在处理数组之前删除它们。例如,您可以使用某些扩展名:

extension Array where Element == String {

    func filterEmpty() -> [String] {
        return filter({ !$0.isEmpty })
    }
}

后来以这种方式使用它:

let imgArray = image.components(separatedBy: "style=").filterEmpty()

另外,你的循环有点令人困惑。你可以在没有循环的情况下完成。例如:

let image = "style=A>style=B>Bstyle=C>C"
var imgArray = image.components(separatedBy: "style=").filterEmpty()
var newImgArray = [String]()
var multImgArray = [[String]]()
switch imgArray.count {
case 2...:
    multImgArray = imgArray.map({ $0.components(separatedBy: ">").filterEmpty() })
case 1:
    newImgArray = imgArray[0].components(separatedBy: ">").filterEmpty()
default:
    break
}

因此,它可能解决循环问题。希望它有所帮助

P.S。甚至这样:

let image = "style=A>style=B>Bstyle=C>C"
let imgArray = image.nonEmptyComponents(separatedBy: "style=")
let newImgArray = imgArray.first?.nonEmptyComponents(separatedBy: ">") ?? []
let multImgArray = imgArray.map({ $0.nonEmptyComponents(separatedBy: ">") })

extension Array where Element == String {

    func filterEmpty() -> [String] {
        return filter({ !$0.isEmpty })
    }
}

extension String {

    func nonEmptyComponents(separatedBy string: String) -> [String] {
        return components(separatedBy: string).filterEmpty()
    }
}