快速制作具有相同地址的对象的副本

时间:2018-07-20 04:45:31

标签: arrays swift nscopying

var empObj : EmployeeModel!
var tempObj : EmployeeModel!

tempObj = empObj.copy() as! EmployeeModel

当我将empObj复制到tempObj时,它的内存地址已更改。我想避免这个主意吗?

3 个答案:

答案 0 :(得分:0)

当您复制它时实际上是一个新的参考。而不是复制只是分配值。那么两者将共享相同的参考

var empObj : EmployeeModel!
var tempObj = empObj

答案 1 :(得分:0)

当您希望相同的地址具有不同的值

USE =

例如。

var ogArray:NSMutableArray() var tempArray = ogArray

答案 2 :(得分:0)

如果您使用对象,则两个变量可以指向同一对象,因此更改一个变量会同时更改它们,而如果您尝试使用structs进行操作,则会发现Swift创建了完整副本,因此更改副本不会影响原版的。 如果要修改类对象的副本以使修改一个对象对其他对象没有影响,则可以使用NSCopying。

  • 使您的类符合NSCopying。并非严格要求
  • 在实际复​​制发生的地方实施方法copy(with:)。
  • 在您的对象上调用copy()。

NSCopy的示例代码

 class Person: NSObject, NSCopying {
    var firstName: String
    var lastName: String
    var age: Int

    init(firstName: String, lastName: String, age: Int) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
    }

    func copy(with zone: NSZone? = nil) -> Any {
        let copy = Person(firstName: firstName, lastName: lastName, age: age)
        return copy
    }
}

在Playground中检查此代码的输出

let paul = Person(firstName: "Paul", lastName: "Hudson", age: 36)
let sophie = paul.copy() as! Person

sophie.firstName = "Sophie"
sophie.age = 6

print("\(paul.firstName) \(paul.lastName) is \(paul.age)")
print("\(sophie.firstName) \(sophie.lastName) is \(sophie.age)")

Reference