为什么两个对象都自动更改了?
Why have both objects changed automatically?
这是我定义的类
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 的城市变了,我该如何解决这个问题?
您实际上是将 Address 的指针传递给您的 Persons。
由于两个人都指向同一个地址,更改 Person1 的地址也会更改 Person2 的地址。
面向对象编程 101.
您将 address
的同一个实例传递给两个对象。从本质上讲,这意味着约翰和亚当拥有相同的地址,当该地址发生变化时,他们的地址(这只是一个对象)都会发生变化。
如果您想将 Address
用作 value type
而不是 reference type
,您可以将 Address 转换为 struct
,其他一切都可以正常工作:
struct Address {
var city: String
var country: String
init(city: String, country: String){
self.city = city
self.country = country
}
}
值类型,如 Int
和 Double
(以及我们刚刚看到的结构)仅由值标识,而不由其底层内存地址标识。
您正在使用 class 作为地址对象。因此,它通过引用传递。请查看此 post 以获取有关值和引用类型的更多详细信息,https://developer.apple.com/swift/blog/?id=10。
在您的情况下,如果您将地址从 Class 更改为 Struct,一切都会按您预期的那样进行,因为结构是按值传递的。
struct Address {
let city: String
let country: String
}
而且,请注意您不需要任何初始化程序。默认情况下,结构会创建初始化程序,您可以像上面那样使用它。
这是我定义的类
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 的城市变了,我该如何解决这个问题?
您实际上是将 Address 的指针传递给您的 Persons。
由于两个人都指向同一个地址,更改 Person1 的地址也会更改 Person2 的地址。
面向对象编程 101.
您将 address
的同一个实例传递给两个对象。从本质上讲,这意味着约翰和亚当拥有相同的地址,当该地址发生变化时,他们的地址(这只是一个对象)都会发生变化。
如果您想将 Address
用作 value type
而不是 reference type
,您可以将 Address 转换为 struct
,其他一切都可以正常工作:
struct Address {
var city: String
var country: String
init(city: String, country: String){
self.city = city
self.country = country
}
}
值类型,如 Int
和 Double
(以及我们刚刚看到的结构)仅由值标识,而不由其底层内存地址标识。
您正在使用 class 作为地址对象。因此,它通过引用传递。请查看此 post 以获取有关值和引用类型的更多详细信息,https://developer.apple.com/swift/blog/?id=10。
在您的情况下,如果您将地址从 Class 更改为 Struct,一切都会按您预期的那样进行,因为结构是按值传递的。
struct Address {
let city: String
let country: String
}
而且,请注意您不需要任何初始化程序。默认情况下,结构会创建初始化程序,您可以像上面那样使用它。