非空数组,访问第一个元素时索引超出范围(Swift 2.0)

3

我有一个包含4个UIImageVIew的数组和一个大小可变的图像数组:[UIImage]

我想遍历视图数组,并将最后4张图像分配给每个视图。

let photos = images.suffix(4)
for (index, view) in views.enumerate() {
  if index <= photos.count - 1 {
    view.image = photos[index]
  } else {
    view.image = nil
  }
}

如果images数组中的元素不超过4个,则代码运行得非常完美。但是遇到一个错误:fatal error: ArraySlice index out of range

在for循环中,我打印出了index,看起来当index0时会发生崩溃。在同一个循环中,views.countphotos.count都返回4

因此,在访问一个非空数组的第一个 - 0个元素时出现了错误。

在Swift 1.2中,这段代码能够无缺陷地工作:

let photos = suffix(images, 4)
for (index, view) in enumerate(views) {
  if index <= photos.count - 1 {
    view.image = photos[index]
  } else {
    view.image = nil
  }
}

切换到2.0版本后唯一的变化在于suffixenumerate方法。

这看起来像是一个Swift 2.0的bug还是我做错了什么呢? 源代码链接

我得出的解决方案:

let photos = Array(images.suffix(4))

应该与Swift 1.2中的suffix()函数完全相同


嗨,我认为重新实现后缀是不必要的。只需使用传递给初始化程序的切片创建一个新数组即可完成操作。由于Swift结构体是写时复制的,因此没有性能或内存惩罚。 - Fujia
福佳,好的解决方案!问题已更新。 - Richard Topchii
1个回答

5
由于对ArraySlice进行了最近的更改,所以现在ArraySlice的索引不再从零开始。例如,如果images.count == 10,那么images.suffix(4).startIndex == 5。请参阅此处的发布说明,并搜索“为了保持一致性和更好的通用代码组成”。

谢谢!有没有快速修复ArraySlice使其重新变为从零开始的方法? - Richard Topchii
1
@RichardTopchiy 可能需要将后缀切片包装在一个新数组中,或者使用 'photos[index + photos.startIndex]'。我是在火车上回复的,没有测试过。 - Fujia
好的观点!我刚刚重新实现了suffix()函数。 - Richard Topchii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接