2016-01-14 45 views
0

我用下面的類來管理圖片的幻燈片的列表和跟蹤活動的幻燈片干擾:手勢事件與地產觀察者捕捉性能處於無效狀態

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 
    ... 
} 

它運作良好,大部分的時間,但偶爾刷來回觸發active屬性獲取array index out of range例外。這意味着手勢事件中斷並執行代碼,將實際值設置爲activeIndex並呼叫其觀察者,防止activeIndex存儲無效值。

問題是爲什麼發生在第一個地方,什麼是解決方案?

回答

1

有一個在這條線上你的代碼中的錯誤:

if activeIndex > list.count 

它應該是:

if activeIndex >= list.count 
+0

謝謝,就是它了。關閉一個錯誤... –

+0

@dfri如果你的意思是我假設列表總是有元素,即使它看起來可能是空的,我已經覆蓋了該部分。 –

+2

@DalijaPrasnikar或者我會在這裏提一下:'myIntVar ++'將在Swift 3中被棄用,爲了不會在未來破壞你的應用程序,你最好使用'myIntVar = myIntVar + 1'。 – dfri

1

user3608334:的回答上面指出的off-by-一個錯誤導致運行時例外,但我會認爲我會添加一些關於可能有價值的代碼的觀點。


++--運營商將在斯威夫特3.

關於當前使用它被廢棄,注意在next() return語句return activeIndex++return activeIndex--prev()方法將分別返回當前值的副本之前發生突變。

// ... 
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 
    } 
} 
+0

我剛剛注意到你的'didSet'邏輯不是正確的那一個。如果activeIndex的值超出範圍,它不應該被設置爲舊值,但應該環繞 - 如果它是'<0'應該變爲'count-1',如果'> = count'應該變爲'0'對我來說很重要,但對於未來的讀者... –

+0

@DalijaPrasnikar我錯過了它應該不斷滾動回到開始,如果超過了最後一張幻燈片,我的壞(認爲這是停止在結束/開始幻燈片)。將更新,謝謝! – dfri