Swift 2 Fehler mit mutierend Funktion in der Protokoll-Erweiterung "Nicht verwenden mutierend Mitglied auf unveränderlichen Wert: "selbst" ist unveränderlich
Nicht wissen was hier Los ist, wie es scheint, sollte es werden ziemlich straight-forward. Ich habe ein Protokoll, das veränderlich var, eine Erweiterung mit einer mutierenden Funktion. Die Dinge sind kacken sich in die testClass.testFunc, wenn ich versuchen und verwenden Sie mtkAnimQueAppend erklärt in der Verlängerung, bekomme ich diesen Fehler: "Nicht verwenden mutierend Mitglied auf unveränderlichen Wert: "selbst" ist unveränderlich.
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
}
}
- Ich finde diese ganze Angelegenheit schon unglaublich auf mehreren Ebenen. Die sehr erste, was Sie tun möchten, mit Swift, ist natürlich eine mixin, dass Werke wie dieses, für view-Controller. Ich meine, es ist ein Protokoll-orientierte Sprache. Und ios "ist view-Controller". Also, was ist die erste Sache, die Sie tun? Für mich ist es unglaublich, dass (A) Apple hat nicht aufgeräumt, dies von Beginn an entgegen zu wirken, und (B) das Thema ist so obskur. Es sollte 10,000 QA über das überall! Ah gut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass im Protokoll markieren Sie die Funktion als mutiert, was müssen Sie tun, wenn Sie möchten, verwenden Sie das Protokoll auf eine struct. Allerdings, das selbst, wird an
testFunc
ist unveränderlich (es ist eine Referenz auf eine Instanz der Klasse) und das ist, stolpert der compiler. Dies würde Sinn machen, wenn testClass war eigentlich ein struct, und Sie könnte die Funktion mutiert das Problem zu beheben.Ich sehe zwei Lösungen:
machen die Protokoll-Klasse nur
Machen Testklasse eine Struktur, und markieren Sie testFunc als mutating.
So oder so, ich denke, dies ist ein Fehler, muss an Apple berichtet.
Bearbeiten
self
Seit
mutableSelf
ist ein Hinweis, alle änderungen, die mutiert-Funktion macht immer noch werden, spiegelt sich inself
's Zustand.