美文网首页IOS开发前端程序员
Swift中如何深拷贝Array中的对象

Swift中如何深拷贝Array中的对象

作者: Fluent | 来源:发表于2016-05-16 17:56 被阅读2795次

我们在开发中会经常使用到数组,在OC中数组可以copy或者mutableCopy,但是在Swift中数组就不能直接拷贝了,为什么呢?大家可以看到下面一张图片,发现它是struct,那么怎么进行copy,下面小编给大家介绍一下吧。


Swift中Array是结构体

没有copy的 情况

首先,创建Person类:

class Person : NSObject {
    var name: String?
    var age: Int?
}

创建两个person,并赋值给self.personArray

    var personArray: Array<Person>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let person1 = Person()
        person1.name = "ZhangFei"
        person1.age = 25
        
        let person2 = Person()
        person2.name = "GuanYu"
        person2.age = 18
        
        let persons = [person1,person2]
        // 赋值给self.personArray
        self.personArray = persons
        // 修改第一个对象的name
        self.personArray[0].name = "LiuBei"
        print(persons[0].name)
   
    }

下张图片是运行后的结果,大家会发现persons的第一个对象的name被修改了。


打印结果是LiuBei

copy后的情况

这里介绍三种方法

第一种:NSCopying

要想对Person进行copy,首先要遵守NSCopying协议和实现copyWithZone方法

class Person : NSObject, NSCopying {
    var name: String?
    var age: Int?
    
    func copyWithZone(zone: NSZone) -> AnyObject {
        let person = Person()
        person.name = self.name
        person.age = self.age
        return person
    }
}

利用map对数组中每个对象进行copy

    var personArray: Array<Person>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let person1 = Person()
        person1.name = "ZhangFei"
        person1.age = 25
        
        let person2 = Person()
        person2.name = "GuanYu"
        person2.age = 18
        
        let persons = [person1,person2]

        // 深拷贝
        self.personArray =  persons.map{($0.copy() as! Person) }
        // 修改第一个对象的name
        self.personArray[0].name = "LiuBei"
        print(persons[0].name)
   
    }

下张为运行后的结果,大家会发现persons的第一个对象的name没有被改变

打印结果是ZhangFei
第二种:自定义copy协议

第一种需要继承NSObject,这种是纯swift写法

protocol Copyable {
    func copy() -> Copyable
}

class Person: Copyable {
    var name: String?
    var age: Int?
    func copy() -> Copyable {
        let p = Person()
        p.name = name
        p.age = age
        return p
    }
}

使用和第一种一样

第三种:使用Struct

在swift中的结构体和oc不同,oc中只能加实例变量,swift中不仅能加实例变量还能加方法

struct Person3 {
    var name: String?
    var age: Int?
}

使用

   var person1 = Person3()
        person1.name = "ZhangFei"
        person1.age = 25
        
        var person2 = Person3()
        person2.name = "GuanYu"
        person2.age = 18
        let persons = [person1,person2]
        
        var personArray: [Person3] =  persons
        // 修改第一个对象的name
        personArray[0].name = "LiuBei"
        print(persons[0].name)

以上三种方法能可以实现copy,在swift中如果不需要继承最好使用结构体。

相关文章

  • Swift中如何深拷贝Array中的对象

    我们在开发中会经常使用到数组,在OC中数组可以copy或者mutableCopy,但是在Swift中数组就不能直接...

  • 理解Array和NSArray的差异

    按值语义实现的Array 在Swift中,Array是按照值语义实现的,当我们复制一个Array对象时,会拷贝整个...

  • `JSON.parse(JSON.stringfy())`进行

    浅拷贝与深拷贝 针对对象 深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的,String,Nu...

  • 多类型深拷贝

    // 深拷贝:对对象内部进行深拷贝,支持 Array、Date、RegExp、DOMconst deepClone...

  • js中的深拷贝和浅拷贝

    一、深拷贝与浅拷贝 深拷贝和浅拷贝只针对Object,Array这些复杂的引用对象。浅拷贝,只复制对象的引用的地址...

  • JSON.stringify深拷贝的缺点

    浅拷贝和深拷贝: 针对对象深拷贝和浅拷贝只针对像Object和Array这样的复杂对象的,String,Numbe...

  • 认识js下的浅拷贝与深拷贝

    浅拷贝与深拷贝 首先深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅拷贝只拷贝一...

  • Js深拷贝

    1、vuex中深拷贝方法 注: 如果要区分数组和对象, 使用使用 Array.isArray 或者 Object....

  • 浅拷贝和深拷贝

    浅拷贝和深拷贝都是只针对Object,Array这样的复杂对象。浅拷贝只复制一层对象的属性,而深拷贝则是递归复制了...

  • 初探浅拷贝&深拷贝

    思考 这个代码为什么具有深拷贝作用 浅拷贝与深拷贝 在JavaScript中,对于Object和Array这类引用...

网友评论

本文标题:Swift中如何深拷贝Array中的对象

本文链接:https://www.haomeiwen.com/subject/uvvbrttx.html