2016-03-28 11 views
1

は私がなぜ両方のオブジェクトが自動的に変更されたのですか?ここで

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) 

を定義したクラスである私はPERSON1アドレスの都市を変更しますが、なぜPERSON2都市の変更をした、そしてどのように私はこの問題を克服するのですか?

+1

JamesがSwiftで参照によって変数を渡すことを指摘しているように。あなたが望む振る舞いに対して、クラスを値によって変数を渡す構造体に変更します。 – beyowulf

答えて

4

Addressオブジェクトにクラスを使用しています。したがって、それは参照渡しです。値と参照の種類の詳細については、https://developer.apple.com/swift/blog/?id=10を参照してください。

住所をクラスから構造体に変更すると、すべてが期待どおりに機能し、構造体は値渡しされます。

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

そして、初期化子は必要ありません。構造体はデフォルトで初期化子を作成します。この初期化子は上記のように使用できます。

1

実際には、住所のポインタをあなたの人に渡しています。

両方の人が同じアドレスを指しているので、Person1のアドレスを変更するとPerson2のアドレスも変更されます。

3

オブジェクト指向あなたは両方のオブジェクトにaddressの同じインスタンスを渡している101

プログラミング。基本的には、JohnとAdamが同じアドレスを持っていることを意味し、そのアドレスが変更されると、両方のアドレス(ただ1つのオブジェクト)が変更されます。

あなたはreference typeとは対照的に、value typeとしてAddressを使用したい場合は、あなたがstructにアドレスを変換することができ、そして他のすべてがうまく動作します:IntDoubleなどの

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

値型は、(と私たちが見たような構造体)は、その基礎となるメモリアドレスではなく、値によって識別されます。

関連する問題