致命错误:in循环swift 3的索引超出范围

我试图在Github上使用simplePDF框架创建一个保存到pdf方法。 我有几个数组,并尝试使用for循环。 这是我的第一次,但我不明白为什么我会致命的错误:索引超出范围。 这是我的代码。

let A4paperSize = CGSize(width: 595, height: 842) let pdf = SimplePDF(pageSize: A4paperSize) pdf.setContentAlignment(.center) let count = Globals.datesArray.count var sum = 0 for index in 0...count { pdf.addText(Globals.datesArray[index]) pdf.addText(Globals.titleArray[index]) pdf.addText(Globals.descriptionArray[index]) sum += index } let pdfData = pdf.generatePDFdata() 

任何帮助深表感谢。 谢谢!

两个答案都是正确的,但都不是理想的。

这可行:

 for index in 0.. 

但是,使用它会好得多:

 for index in Globals.datesArray.indicies 

这样就为你创建了范围,并消除了错字的可能性( ...而不是..<

旁注:

我关心的是您使用3个数组来存储相关数据。 维基百科有一节关于并行数组的优缺点 。 他们在现代高级编程中确实没有地位。 他们工作繁琐,而且非常脆弱。 例如,如果将一个元素添加到datesArraytitleArray的中间,但忘记在descriptionArray添加descriptionArray ,那么突然之间,您的日期/标题和描述之间会有不匹配。

您应该尝试使用classstruct 。 例如,您可能需要这样的结构声明:

 struct Thing { //TODO: give me a name! let date: Date let title: String let description: String } 

这可以让你改变一个凌乱的并行结构,如下所示:

 let datesArray = [date0, date1, date2] let titlesArray = ["title0", "title1", "title2"] let descriptionsArray = ["Description 0", "Description 1", "Description 2"] 

进入这样一个:

 let things = [ Thing( date: date0, title: "title0" description: "Description 0" ), Thing( date: date1, title: "title1" description: "Description 1" ), Thing( date: date2, title: "title2" description: "Description 2" ), ] 

通过这个第二个声明,所有与单个Thing有关的信息都是紧密地存储起来的。 它可以让您更轻松地进行添加/编辑。 没有更多计数元素,以确保他们排队!

有了这样的结构,您的代码可以这样编写:

 let A4paperSize = CGSize(width: 595, height: 842) let pdf = SimplePDF(pageSize: A4paperSize) pdf.setContentAlignment(.center) var sum = 0 for (index, thing) in things.enumerated() { pdf.addText(thing.date) pdf.addText(thing.title) pdf.addText(thing.description) sum += index } let pdfData = pdf.generatePDFdata() 

该代码段使用enumerated() ,它允许您迭代元素及其索引。 这样,我们就不必在循环体中下标我们的数组。

但是,在这种情况下, sum将始终是0, 1, ... , count的总和。 这等于just (count * (count + 1)) / 2 ,因此我们可以进一步简化代码:

 let A4paperSize = CGSize(width: 595, height: 842) let pdf = SimplePDF(pageSize: A4paperSize) pdf.setContentAlignment(.center) for (index, thing) in things.enumerated() { pdf.addText(thing.date) pdf.addText(thing.title) pdf.addText(thing.description) } let pdfData = pdf.generatePDFdata() let sum = (count * (count + 1)) / 2 

现在因为我们不再在for循环体中使用index ,所以我们可以使用常规迭代,而不使用enumerated()

 let A4paperSize = CGSize(width: 595, height: 842) let pdf = SimplePDF(pageSize: A4paperSize) pdf.setContentAlignment(.center) for index in things { pdf.addText(thing.date) pdf.addText(thing.title) pdf.addText(thing.description) } let pdfData = pdf.generatePDFdata() let sum = (count * (count + 1)) / 2 

大卫回答的替代方案:

 for index in 0...count { 

可能

 for index in 0.. 

这将循环直到但不包括计数。

我认为应该let count = Globals.datesArray.count - 1 。 如果Globals.count == 3,则索引为[0,1,2],[3]将超出范围。