2015-10-13 22 views
44

不知道這裏發生了什麼事情,這看起來應該是非常直截了當我有一個協議mutable var ,這是一個具有突變功能的擴展。當我嘗試並使用mtkAnimQueAppend在擴展中聲明時,出現此錯誤:「無法對不可變值使用變異成員:'self '是不可改變的。Swift 2在協議擴展中使用變異函數的錯誤「不能在不可變的值上使用變異成員:'self'是不可變的

protocol MTKAnimateValueDelegate { 
    var mtkAnimQue:[MTKAnimateValue]? {get set} 
} 

extension MTKAnimateValueDelegate { 
    ///Adds element to que 
    mutating func mtkAnimQueAppend(element:MTKAnimateValue) { 

     if mtkAnimQue != nil { 
      mtkAnimQue?.append(element) 
     } else { 
      mtkAnimQue = [element] 
     } 
    } 
} 

class testClass: MTKAnimateValueDelegate { 

    var mtkAnimQue:[MTKAnimateValue]? 

    func testFunc() { 
    var animValue = MTKAnimateValue(fromValue: 10, toValue: 20, inSeconds: 2) 
    animValue.isAnimating = true 
    mtkAnimQueAppend(animValue) //ERROR: "Cannot use mutating member on immutable value: 'self' is immutable 
    } 

} 
+0

我發現這個問題在很多層面上都令人難以置信。 Swift首先要做的事情當然是爲視圖控制器製作一個像這樣的混音器。我的意思是它是一種面向協議的語言。而ios「是視圖控制器」。那麼你做的第一件事是什麼?對我來說,(A)蘋果沒有從getgo收集這些信息是無法相信的,(B)這個問題太模糊了。無處不在應該有10,000質量保證!呃,好吧。 – Fattie

回答

93

的問題是,在協議中,你標記功能變異,你需要的,如果你想使用的協議上的結構做。但是,傳遞給testFunc的自己是不可變的(它是對類實例的引用),並且正在跳過編譯器。這是有道理的,如果testClass實際上是一個結構,你可以使該函數變異來解決問題。

我可以看到兩個變通:

  1. 使協議類只

    protocol MTKAnimateValueDelegate: class { ... 
    
  2. 使TestClass的一個結構和標誌testFunc的變異。

無論哪種方式,我認爲這是一個需要向蘋果報告的錯誤。

+4

我的天啊。我從來不知道這一點。真棒! – devxoul

+4

我希望類協議是Xcode建議的第一件事。感謝您的幫助 – Aron

+0

感謝您的整理答案JeremyP。我發了一個賞金說謝謝。 – Fattie

相關問題