美文网首页
Swift中Struct和Class的区别。(面试的时候很有可能

Swift中Struct和Class的区别。(面试的时候很有可能

作者: 小吖朱 | 来源:发表于2017-12-05 16:41 被阅读0次

    Struct概述

    Swift语言有两种基本的数据类型,即类(class)和结构体(struct),class这样的概念大家不会陌生,而struct也并不是什么新的概念,在Objective-C和C++也有struct,不过swift将struct提升到一个更高更重要的层次,甚至swift Foundation框架的SDK,诸如String,Array,Dictionary都是基于struct实现的。

    笔者刚开始接触swift时,认为struct是一个附属品,然而随着开发的深入和阅读代码量的上升,发现struct的使用场景很多,而且很好用。

    那么struct与class相比,有什么区别呢?主要的区别就在于class是类型引用,而struct是值引用,在Objective-C时代,我们对类型引用和值引用就有了一定的了解,例如在Objective-C中常用的NSArray, NSDictionary, NSString, UIKit等都是类型引用;而NSInteger, CGFloat, CGRect等则是值引用。显然,在Objective-C中,引用类型占据了很大的比重,现在使用swift开发应用程序,开发者需要转变观念,因为struct在swift变得越来越重要,观念的转变不仅在于多使用struct,还要求开发者理解struct的原理,优点及缺点。

    在swift中,类型引用和值引用的区别在于,对于类型引用(class reference),将变量a赋值给变量b,即b = a,这样的赋值语句仅仅将b的指针与a的指针一样,指向同一块内存区域,此时改变b的值,a也会跟着改变;而对于值引用(value reference),赋值语句b = a处理的过程是开辟一个新的内存b,将a变量的内容拷贝后存放到内存b,这时a和b完全没有关系的两个变量,对b的改变不会影响到a,反之亦然。

    测试代码如下 运行结果你就知道了,你也可以 也可看看四个对象的内存地址结果很清楚
    struct dog {
        var dogName : String?
        init(dogName : String) {
            self.dogName = dogName
        }
    }
    var adog = dog.init(dogName: "阿黄")
    var bdog = adog
    bdog.dogName = "小黑"
    print(adog.dogName!)
    print(bdog.dogName!)
    
    class Doog {
        var name : String?
        init(name:String) {
            self.name = name
        }
        
    }
    
    var doogA = Doog.init(name: "小黑")
    var doogB = doogA
    doogB.name = "小花"
    print(doogA.name!)
    print(doogB.name!)
    

    相关文章

      网友评论

          本文标题:Swift中Struct和Class的区别。(面试的时候很有可能

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