2015-10-13 59 views
44

Non so cosa sta succedendo qui, sembra che dovrebbe essere abbastanza semplice. , un'estensione con una funzione di muting Le cose stanno saltando nel testClass.testFunc, quando provo e uso mtkAnimQueAppend dichiarato nell'estensione, ottengo questo errore: "Non posso usare il membro mutante su valore immutabile: 'self 'è immutabile.Swift 2 Errore nell'uso della funzione di muting nell'estensione del protocollo "Impossibile utilizzare il membro mutante su un valore immutabile: 'self' è immutabile

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

Trovo che l'intera questione sia abbastanza incredibile su un certo numero di livelli. La prima cosa che vuoi fare con Swift è ovviamente creare un mixin che funzioni in questo modo, per i controller di visualizzazione. Voglio dire che è un linguaggio orientato al protocollo. E ios "è vista controller". Quindi qual è la prima cosa che fai? Per me è incredibile che (A) Apple non l'abbia tolto dal getgo, e (B) il problema sia così oscuro. Dovrebbero esserci 10.000 QA su questo ovunque! Ah bene. – Fattie

risposta

93

Il problema è che, nel protocollo si seleziona la funzione di mutazione, che è necessario fare se si vuole utilizzare il protocollo su una struct. Tuttavia, il sé passato a testFunc è immutabile (è un riferimento a un'istanza della classe) e sta facendo il punto sul compilatore. Questo avrebbe senso se testClass fosse in realtà una struttura e si potesse rendere la funzione mutante per risolvere il problema.

posso vedere due arounds di lavoro:

  1. rendere la classe protocollo unico

    protocol MTKAnimateValueDelegate: class { ... 
    
  2. Fai TestClass una struct e segnare TestFunc come mutazione.

In entrambi i casi, penso che questo sia un bug che deve essere segnalato ad Apple.

+4

Oh mio Dio. Non l'ho mai saputo. Eccezionale! – devxoul

+4

Vorrei che un protocollo di classe fosse la prima cosa suggerita da Xcode. Grazie per il tuo aiuto – Aron

+0

Grazie per la risposta ordinata JeremyP. Ho inviato una taglia per ringraziare. – Fattie