2015-10-13 14 views
44

Burada olup bitenden emin olmadığından emin olun, bu oldukça düz bir şekilde ileriye dönük olmalıdır. , bir mutasyon işlevine sahip bir uzantı. testClass.testFunc'da, hatada bildirilen mtkAnimQueAppend kullanmayı denediğimde, bu hatayı alıyorum: "Değişken değerde mutasyona uğrayan üye kullanılamıyor:" 'değişmezdir.Swift 2 Protokol eklentisinde mutasyon işlevini kullanmayla ilgili hata "Değişken değerde mutasyona uğrayan üye kullanılamıyor: 'kendi kendini değiştiremez':

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

Tüm bu sorunu birkaç düzeyde oldukça inanılmaz buluyorum. Swift ile yapmak istediğiniz ilk şey, elbette, denetleyiciler için bu şekilde çalışan bir karıtır. Yani protokol yönelimli bir dil. Ve ios "denetleyicileri görüyor". Peki, ilk yapman gereken nedir? Benim için (A) Apple'ın bunu getgodan ayırmadığı ve (B) meselenin çok karanlık olduğu inancının ötesinde. Her yer için 10.000 QA olmalı! Ah iyi. – Fattie

cevap

93

sorun protokolünde size bir yapı üzerinde protokolünü kullanmak istiyorsanız yapmanız gereken, hangi mutasyona olarak işlevini işaretlemek, olmasıdır. Bununla birlikte, testFunc'a geçirilen benlik değişmezdir (bu, sınıfın bir örneğine yapılan bir referanstır) ve derleyiciyi açmaktır. TestClass aslında bir yapı olsaydı ve bu sorunu çözmek için mutasyona neden olabilir.

iki eser arounds görebilirsiniz:

  1. sadece

    protocol MTKAnimateValueDelegate: class { ... 
    
  2. mutasyona olarak TestClass bir yapı ve işareti testFunc olun protokol sınıfını olun.

Her iki durumda da, bunun Apple'a bildirilmesi gereken bir hata olduğunu düşünüyorum.

+4

Oh tanrım. Bunu hiç bilemedim. Korku veren! – devxoul

+4

Xcode'un önerdiği ilk şey bir sınıf protokolü olsaydı. Yardımınız için teşekkürler. – Aron

+0

Düzenli yanıt için JeremyP'e teşekkür ederiz. Teşekkür etmek için bir ödül gönderdim. – Fattie

İlgili konular