2016-03-28 15 views
1

İşteHer iki nesne neden otomatik olarak değişti?

ben person1 adresinin şehir değiştirdi
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) 

tanımlanmış ama neden PERSON2 şehir değişti sınıfları vardır ve nasıl sorun üstesinden gelirsiniz?

+1

James'in işaret ettiği gibi, Swift değişkenine göre değişkenleri iletir. İstediğiniz davranış için, sınıflarınızı değişkenleri değere göre geçen yapılara değiştirin. – beyowulf

cevap

4

Adres nesnesinin sınıfını kullanıyorsunuz. Yani referans olarak geçiyor. Değer ve Referans türleri, https://developer.apple.com/swift/blog/?id=10 hakkında daha fazla bilgi için lütfen bu gönderiye bakın.

Sizin durumunuzda, Adresinizi Class'tan Struct'e değiştirirseniz, her şey beklediğiniz gibi çalışır, struct değerleri değere aktarılır.

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

Ve herhangi bir başlatıcıya ihtiyacınız olmadığını fark edin. Varsayılan olarak yapı, yukarıda yaptığınız gibi kullanabileceğiniz başlatıcıyı oluşturur.

1

Aslında Kişilerinizin Adresinin bir işaretçisini geçiriyorsunuz.

Her iki kişi de aynı Adrese işaret ettiğinden, Kişi1'in adresini değiştirmek aynı zamanda Kişi2'yi değiştirecektir.

3

Her iki nesnelere address aynı örneğini geçiyoruz 101.

Programlama Amaçlanan Odaklı. Esasen, John ve Adam'ın aynı adrese sahip olduğu ve bu adres değiştiğinde, adreslerinin (sadece bir nesne) değiştiği anlamına gelir. Bir reference type aksine bir value type olarak Address kullanmak istiyorsanız

, bir struct için Adres dönüştürebilir ve her şey sadece çalışacaktır:

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

Değer türleri, Int ve Double (ve benzeri Gördüğümüz gibi, yapılar sadece bir değerle değil, temel bellek adresleriyle tanımlanır.