美文网首页iOS开发iOS学习开发
Swift优雅的copy一个类对象

Swift优雅的copy一个类对象

作者: seasonZhu | 来源:发表于2018-08-10 17:57 被阅读12次

Struct的Copy

我们都知道Swift中的结构体是值传递.也就是说如果我们将某个结构体对象A赋值给对象B.
如果我们将A里面的属性进行改变,实际上B对象的属性并没有跟着改变.
这个的本质其实是B对象是另外开辟了一段内存空间.已经完完全全和A分道扬镳了.

Class的Copy

类的Copy是引用传递,其实质是内存地址的传递.所以你可以得出与OC环境下一样的情况.
当然,我们也可以通过类继承NSObject,遵守NSCopying协议去拷贝一个对象.
这里就不再多举这样的例子.

既然我们都使用Swift了,那么就不能用更优雅的Copy吗?
有大佬说过--“面向接口编程”的原则告诉我们,我们应该让某个类能够进行Copy, 是要实现某个接口,而不是继承自某个子类!

所以我们先来写一个协议

protocol Copyable {
    
    associatedtype T
    
    func copyable() -> T
}

然后我们让我们创建的Student类遵守该协议

class Student: Copyable {
    
    var name: String
    
    /// 关联类型进行指定
    typealias T = Student
    
    
    /// 初始化方法
    ///
    /// - Parameter name: name
    init(name: String) {
        self.name = name
    }
    
    /// 实现Copy协议
    ///
    /// - Returns: 拷贝的对象
    func copyable() -> Student {
        return Student(name: self.name)
    }
}

需要说明的是协议中的associatedtype关联类型

定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。

你可以理解为在协议中声明了某个类型T, 协议的copyable()方法返回一个T类型的对象,而在Student类遵守协议的时候,T被指明为Student类型,进而实现copyable()方法返回一个Student类型的对象

然后我们来进行测试.

func classCopyExample() {
        
        //  源
        let student = Student(name: "season")
        
        //  拷贝
        let student2 = student.copyable()
        
        //  引用传递
        let student3 = student
        
        print("before student.name: \(student.name)")
        
        print("before student2.name: \(student2.name)")
        
        print("before student3.name: \(student3.name)")
        
        student.name = "soso"
        
        print("after student.name: \(student.name)")
        
        print("after student2.name: \(student2.name)")
        
        print("after student3.name: \(student3.name)")
       
}

打印的日志为

before student.name: season
before student2.name: season
before student3.name: season
after student.name: soso
after student2.name: season
after student3.name: soso

这样我们就完成了对类对象的Copy行为了.
当然我们让Student类继承NSObject,再遵守Copyable协议也是可以的.

相关文章

  • Swift优雅的copy一个类对象

    Struct的Copy 我们都知道Swift中的结构体是值传递.也就是说如果我们将某个结构体对象A赋值给对象B.如...

  • 原型模式在swift中的体现

    通过对一个对象进行copy创建出一个新的对象。在swift中我们可以创建一个copying协议,某个类遵守该协议后...

  • iOS 字符串的copy,mutableCopy(笔记)

    首先,声明 对非集合类对象的copy操作: 在非集合类对象中:对 immutable 对象进行 copy 操作,是...

  • Copy & MutableCopy

    1. 对非集合类对象的copy操作: 在非集合类对象中:对 immutable 对象进行 copy 操作,是指针复...

  • 深复制与浅复制

    对非集合类对象的copy操作 在非集合类对象中:对 immutable 对象进行 copy 操作,是指针复制,mu...

  • 深拷贝 浅拷贝

    copy与mutableCopy 不管是集合类对象,还是非集合类对象,接收到copy和mutableCopy消息时...

  • 解开对copy、mutableCopy,深复制和浅复制的疑惑

    一、深拷贝,浅拷贝 二、非集合类的对象 shallow copy 和 deep copy 三、集合类的对象自身的 ...

  • Swift中类的定义

    Swift中类的定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 在Swift中如何定...

  • iOS Copy解析以及源码分析

    Copy解析 测试代码: 输出结果: Copy结论: Copy 得到的对象是 immutable 类,比如NSMu...

  • Swift3.x - 类和结构体

    类的介绍和定义 Swift也是一门面向对象的开发语言。 面向对象的基础就是类,类产生对象。 Swift如何定义类:...

网友评论

    本文标题:Swift优雅的copy一个类对象

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