2016-06-10 4 views
0

Kommend von JS, und versuchen, [JSON] durch Verweis in Swift übergeben, was nicht möglich ist, also versuche ich es in das Objekt zu wickeln, und machte ein einfaches Beispiel mit einem primitiven, was immer noch nicht funktioniert, wie kann ich Mitglied a einhüllen, so dass Änderungen in referenzierten Objekt a beeinflussen b? Dankswift: durch Referenz

class ExampleA { 
    var a = 0 
    init(a: Int) { 
     self.a = a 
    } 
} 
class ExampleB { 
    var a = 0 
    init(a: Int) { 
     self.a = a 
    } 
    func process(inout p: ExampleA) { 
     self.a = p.a 
     print(p.a) 
    } 
} 

var a = ExampleA(a: 15) 
var b = ExampleB(a: 10) 

b.process(&a) 

print(b.a) // "15\n" 
a.a = 25 // this does nothing to b???? 
print(b.a) // "15\n" 
+0

Warum es 'b' auswirken würde? Sie rufen nicht 'process' auf, nachdem Sie' a.a' geändert haben. –

+1

Sie sollten eine explizite Delegatenstruktur einrichten, um die Werte basierend auf anderen zu ändern. Sie sollten nicht einfach implizit "magisch" ihre Werte ändern. – luk2302

+0

gibt es keine Möglichkeit, auf etwas wie in JS zu verweisen, um Änderungen sofort wiederzugeben, wenn sich die Werte im referenzierten Objekt ändern? –

Antwort

0

Ihr Beispiel schlägt fehl, weil a ein Int ist, der einen Wert-Typ ist.

Wenn Sie die Zuweisung self.a = p.a machen, machen Sie eine Kopie des Int.

Um die gewünschte Referenzsemantik zu erhalten, müssen Sie auf die ExampleA verweisen, die den Werttyp speichert. Ich denke, dass Sie wegen Ihrer variablen Benennung verwirrt wurden, verwirrend das a : Int Mitglied von ExampleA mit Instanzen von ExampleA genannt a.

Hier ist eine Lösung, die ich zusammengestellt habe. Es gibt ExampleB eine berechnete Eigenschaft, die transparent auf die data in ExampleA zugreift.

class ExampleA { 
    var data = 0 
    init(data: Int) { 
     self.data = data 
    } 
} 

class ExampleB { 
    var a : ExampleA 

    var data : Int { 
     get { 
      return a.data 
     } 
     set { 
      a.data = newValue 
     } 
    } 

    init(data: Int) { 
     self.a = ExampleA(data: data) 
    } 

    func process(a: ExampleA) { 
     self.a = a 
     print(a.data) 
    } 
} 

var a = ExampleA(data: 15) 
var b = ExampleB(data: 10) 

b.process(a: a) 

print(b.data) // "15\n" 
a.data = 25 
print(b.data) // "25\n" 
0

Einfache Delegation arbeitet ohne wirkliche Notwendigkeit für inout oder Referenzsemantik:

class ExampleA { 
    var a = 0 
    init(a: Int) { 
     self.a = a 
    } 
} 
class ExampleB { 
    var aObject: ExampleA 
    init(a: ExampleA) { 
     self.aObject = a 
    } 

    func a() -> Int { 
     return aObject.a 
    } 
} 

var a = ExampleA(a: 15) 
var b = ExampleB(a: a) 


print(b.a()) 
a.a = 25 
print(b.a())