我正在解析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
答案 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()
}
}