我使用以下课程来管理图片幻灯片列表并跟踪活动幻灯片:
class Slides
{
var list: [String] = []
var activeIndex: Int = 0
{
didSet
{
if activeIndex < 0
{
activeIndex = list.count - 1
}
else
if activeIndex > list.count
{
activeIndex = 0
}
}
}
var active: String
{
get
{
return list[activeIndex]
}
}
func next() -> Int
{
return activeIndex++
}
func prev() -> Int
{
return activeIndex--
}
}
函数prev()
和next()
以循环方式为我提供上一张或下一张幻灯片 - 包装到幻灯片列表的开头或结尾。
我正在使用activeIndex
属性观察器来阻止设置无效索引。
在应用程序中,我使用滑动手势来显示下一张或上一张幻灯片。
@IBAction func onSwipeLeft(sender: AnyObject)
{
slides.next()
let slide = slides.active
...
}
@IBAction func onSwipeRight(sender: AnyObject)
{
slides.prev()
let slide = slides.active
...
}
它在大多数情况下运行良好,但偶尔会在array index out of range
属性getter中来回触发active
异常。这意味着手势事件中断并执行代码,将实际值设置为activeIndex
并调用其观察者,以阻止activeIndex
存储无效值。
问题是为什么首先发生这种情况,解决方案是什么?
答案 0 :(得分:1)
此行代码中存在错误:
if activeIndex > list.count
应该是:
if activeIndex >= list.count
答案 1 :(得分:1)
user3608334:上面的回答指出导致运行时异常的一个错误,但我想我会添加一些关于可能有价值的代码的点。
将在Swift 3中弃用++
和--
运算符。
关于它的当前用法,请注意return activeIndex++
和return activeIndex--
方法中的返回语句next()
和prev()
将返回当前的副本activeIndex
之前对变异的价值。
// ...
activeIndex = 1
return activeIndex++ /* returns 1, activeIndex is set to 2 */
next()
和prev()
函数可能不需要返回一个值,只需要改变activeIndex
,至少在你的例子中如何调用它们。
最后请注意,如果计算属性只有一个getter,那么你可以省略明确说明(并且只使用一组大括号)。
从上面收集笔记,我们可以将您的课程编写为:
class Slides
{
var list: [String] = []
var activeIndex: Int = 0 {
didSet
{
if activeIndex < 0 {
activeIndex = list.count - 1
}
else if activeIndex >= list.count {
activeIndex = 0
}
}
}
var active: String {
return list[activeIndex]
}
func next() // -> Int
{
activeIndex = activeIndex + 1
// return activeIndex
}
func prev() // -> Int
{
activeIndex = activeIndex - 1
// return activeIndex
}
}