致命错误: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个数组来存储相关数据。 维基百科有一节关于并行数组的优缺点 。 他们在现代高级编程中确实没有地位。 他们工作繁琐,而且非常脆弱。 例如,如果将一个元素添加到datesArray
和titleArray
的中间,但忘记在descriptionArray
添加descriptionArray
,那么突然之间,您的日期/标题和描述之间会有不匹配。
您应该尝试使用class
或struct
。 例如,您可能需要这样的结构声明:
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]将超出范围。
- 将图像编码为base64,获取无效的base64string(使用base64EncodedStringWithOptions的ios)
- MKPolygon初始化错误“在调用中缺less参数'interiorPolygons'的参数”/“调用中的额外参数”
- iOS:UIBezierPath和CAShapeLayer fillRule
- 如何重新加载collectionView中的补充视图
- 如何在alamofire中设置Cookies?
- 在Objective-C中,下划线前缀的variables名是什么意思?
- AVFoundation点击以聚焦反馈矩形
- 无法在Xcode中构建错误“已明确标记为不可用”
- 在ios 5 MP音乐播放器控制器中出现错误的播放状态