2016-08-04 6 views
9

Ich habe folgende Struktur:Kann verwenden mutiert Mitglied nicht auf unveränderlichen Wert vom Typ

public protocol SuperModel { 
    // empty protocol 
} 
struct ModelOne: SuperModel { 
    struct SubModelOne { 
     var someVar: Double 
     var othervar: Double? 
    } 
    var sub: SubModelOne? 
    mutating func setSub(sub: SubModelOne) {   
     self.sub = sub 
    } 
} 

In meiner Klasse, mag ich, dass diese Struktur verwenden:

final class SomeClass: SuperClass { 
    var data: SuperModel 
    init() { 
     self.data = ModelOne() 
    } 
    func someFunc() { 
     (self.data as! ModelOne).setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1)) 
    } 
} 

ich folgende Fehlermeldung erhalten: Cannot use mutating member on immutable value of type 'ModelOne' . Warum ist das so und wie kann ich das beheben?

+2

Was ist NetworkCheckModel? Ein eigenständiges Beispiel wäre nützlich. –

+0

versuchen Sie dies var data = self.data as! ModelOne data.setSub (ModelOne.SubModelOne (someVar: 2, anderevar: 1)) – Sahil

+0

@MartinR Sorry, ich war in Eile und vergaß es zu ändern. Bearbeiten wurde gemacht – j0h4nn3s

Antwort

12

rufen Wenn Sie Type-Casting auf Werttypen (wie structs) anwenden, wenn erfolgreich, erhalten Sie unveränderliche Kopie der angeforderten Wert:

(self.data as! ModelOne) // this is copy of data 

Der einzige Weg (wie mir bekannt ist), wie Sie Werte mutieren können, die zu gegossenen müssen - neu zuweisen Wert (als @Sahil Beri zeigte, dass Sie Variable deklarieren müssen):

func someFunc() { 
    if var data = data as? ModelOne { 
     data.setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1)) 
     self.data = data // you can do this since ModelOne conforms to SuperModel 
    } 
} 
+1

Danke, das funktioniert! – j0h4nn3s

0

Problem ist, dass Sie data als SuperModel deklariert haben, aber es als ModelOne zuweisen. Deklariere data als ModelOne. Dann geht das Problem weg.

final class SomeClass: SuperClass { 
    var data: ModelOne 
    init() { 
     self.data = ModelOne() 
    } 
    func someFunc() { 
     (self.data).setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1)) 
    } 
} 
0

Erste niedergeschlagenen die self.data zu ModelOne dann setSub Funktion

if var data = self.data as? ModelOne { 
    data.setSub(ModelOne.SubModelOne(someVar: 2, othervar: 1)) 
} 
+0

als @ShadowOf schrieb in seiner Antwort, ich muss den Wert zurück zu self.data – j0h4nn3s

+0

kopieren können Sie dies tun, indem Sie selbst.data = Daten wie ich in Kommentaren erwähnt. :) – Sahil

0

@Shadow von ist richtig. Sie versuchen eine temporäre Struktur zu mutieren, die unmöglich und meistens nutzlos ist, da sie nach der Mutation freigesetzt wird. Es ist in der Tat ein ähnliches Problem zu versuchen, die Rückgabestruktur einer Funktion zu ändern. (Siehe hier beantworten: Cannot assign to property: function call returns immutable value)

0

In Swift 3, in meinem Fall, ich war in der Lage, den Fehler zu beheben nur durch struct zu einem class Objekt zu ändern.

+5

Sollte das nicht in Swift tun. – lee

+0

Ja, natürlich reparierst du es! Aber das ist kein kluger Ansatz dafür. Überprüfen Sie https://developer.apple.com/videos/play/wwdc2015/408/ –

Verwandte Themen