ios - 为什么两个对象都自动更改了?

标签 ios xcode swift swift-playground

这是我定义的类

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 的城市发生了变化,我该如何解决这个问题?

最佳答案

您正在为地址对象使用类。因此,它通过引用传递。请查看此帖子以获取有关值和引用类型的更多详细信息,https://developer.apple.com/swift/blog/?id=10 .

在您的例子中,如果您将 Address 从 Class 更改为 Struct,一切都会按您预期的那样工作,因为结构是按值传递的。

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

而且,请注意您不需要任何初始化程序。默认情况下,Struct 创建初始化程序,您可以像上面那样使用它。

关于ios - 为什么两个对象都自动更改了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36268216/

相关文章:

ios - 在 Safari (cordova) 中打开外部链接

ios - Apple Pay 表 产品描述和规范

ios - 当 NSProgress 显示完成时无法读取文件?

ios - Xcode 试图定位或生成匹配的签名 Assets

ios - 如何使用 Objective C 获取 TableviewCell 选中的复选标记行值?

javascript - 从javascript函数返回数组到objective-c xcode

ios - 获取用于在 Swift 中恢复应用内购买的已购买产品 ID 列表

ios - WCSession:是否可以取消排队的消息?

ios - 如何在 Swift 2.0 中滑动删除核心数据 TableView

iphone - 获取 writeToFile :atomically: URL saved to