手势事件干扰属性观察者在无效状态下捕获属性

时间:2016-01-14 13:26:54

标签: ios swift swift2

我使用以下课程来管理图片幻灯片列表并跟踪活动幻灯片:

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存储无效值。

问题是为什么首先发生这种情况,解决方案是什么?

2 个答案:

答案 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
    }
}