2016-03-28 11 views
1

Hier sind die Klassen IWarum wurden beide Objekte automatisch geändert?

definiert
class Person{ 
    var name: String 
    var address: Address 

    init(name: String, address: Address){ 
    self.name = name 
    self.address = address 
    } 

} 

class Address { 
    var city: String 
    var country: String 
    init(city: String, country: String){ 
    self.city = city 
    self.country = country 
    } 
} 


var address = Address(city: "New York", country: "USA") 

    var person1 = Person(name: "John", address: address) 

    var person2 = Person(name: "Adam", address: address) 

    person1.address.city = "Washington" 

    print(person1.address.city) 

    print(person2.address.city) 

ich die Stadt person1 Adresse geändert, aber warum hat person2 Stadt zu ändern, und wie winde ich das Problem?

+1

Als James darauf hinweist, Klassen übergeben Variablen durch Verweis in Swift. Für das Verhalten, das Sie wünschen, ändern Sie Ihre Klassen in Strukturen, die Variablen nach Wert übergeben. – beyowulf

Antwort

4

Sie verwenden die Klasse für Ihr Adressobjekt. Also, es geht durch den Bezug. In diesem Beitrag finden Sie weitere Informationen zu Wert- und Referenztypen, https://developer.apple.com/swift/blog/?id=10.

In Ihrem Fall, wenn Sie Ihre Adresse von der Klasse zu Struct ändern, funktioniert alles wie erwartet, da Strukturen nach Wert übergeben werden.

struct Address { 
    let city: String 
    let country: String 
} 

Und beachten Sie, dass Sie keinen Initialisierer benötigen. Struct erstellt standardmäßig einen Initialisierer, den Sie wie oben verwenden können.

1

Sie geben tatsächlich einen Zeiger der Adresse an Ihre Personen weiter.

Da beide Personen auf die gleiche Adresse zeigen, wird die Änderung der Adresse von Person1 auch von Person2 geändert. Programmierung

3

objekt Oriented 101.

Sie geben die gleiche Instanz von address auf beiden Objekte. Im Wesentlichen bedeutet dies, dass John und Adam die gleiche Adresse haben, und wenn sich diese Adresse ändert, ändern sich ihre Adressen (die nur ein Objekt sind).

Wenn Sie Address als value type verwenden möchten als zu einem reference type Gegensatz, können Sie Adresse zu einem struct konvertieren, und alles andere wird einfach funktionieren:

struct Address { 
    var city: String 
    var country: String 
    init(city: String, country: String){ 
    self.city = city 
    self.country = country 
    } 
} 

Werttypen, wie Int und Double (und Strukturen, wie wir gerade gesehen haben) werden nur durch einen Wert und nicht durch ihre zugrunde liegende Speicheradresse identifiziert.