2015-10-13 1 views
44

Vous ne savez pas ce qui se passe ici, il semble que ce devrait être assez simple. , une extension avec une fonction de mutation.Les choses se désintéressent dans le testClass.testFunc, quand j'essaie d'utiliser mtkAnimQueAppend déclaré dans l'extension, j'obtiens cette erreur: "Impossible d'utiliser un membre mutant sur la valeur immuable: 'self est immuable.Swift 2 Erreur d'utilisation de la fonction de mutation dans l'extension Protocol "Impossible d'utiliser un membre mutant sur une valeur immuable: 'self' est immuable

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

Je trouve tout ce problème incroyable à plusieurs niveaux. La toute première chose que vous voulez faire avec Swift, c'est bien sûr de faire un mixin qui fonctionne comme ça, pour les contrôleurs de vue. Je veux dire que c'est un langage orienté protocole. Et ios "est des contrôleurs de vue". Alors, quelle est la première chose que vous faites? Pour moi, il est impossible de croire que (A) Apple n'a pas ranger cela du getgo, et (B) le problème est si obscur. Il devrait y avoir 10.000 AQ à ce sujet partout! Et bien. – Fattie

Répondre

93

Le problème est que, dans le protocole que vous marquez la fonction muter, que vous devez faire si vous voulez utiliser le protocole sur une struct. Cependant, le self qui est passé à testFunc est immuable (c'est une référence à une instance de la classe) et cela fait trébucher le compilateur. Cela aurait du sens si testClass était réellement une structure et que vous pourriez faire en sorte que la fonction mute pour résoudre le problème.

Je vois deux contournements de travail:

  1. font la classe de protocole ne

    protocol MTKAnimateValueDelegate: class { ... 
    
  2. Faire TestClass une struct et la marque TestFunc comme muter.

De toute façon, je pense que c'est un bug qui doit être signalé à Apple.

+4

Oh mon dieu. Je n'ai jamais su cela. Impressionnant! – devxoul

+4

Je souhaite qu'un protocole de classe soit la première chose que Xcode a suggéré. Merci pour votre aide – Aron

+0

Merci pour la réponse bien rangé JeremyP. J'ai envoyé une prime pour dire merci. – Fattie