美文网首页
swift学习记录--- class 与struc

swift学习记录--- class 与struc

作者: 开了那么 | 来源:发表于2019-05-08 10:24 被阅读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,反之亦然。
    下面运行于demo说明了class的类型引用和struct的值引用的区别,
    class demo

     class somtTemp{
                var someString:String
                init(someString:String) {
                    self.someString = someString
                }
            }
            var classB = somtTemp(someString: "123")
            var classC = classB
            print("第一次赋值---\(classB.someString)-------\(classC.someString)")
            
            classC.someString = "43211"
            print("第二次赋值---\(classB.someString)-------\(classC.someString)")
    

    结果:


    Snip20190508_2.png

    用图解释一下:


    931525-48075e36dd49ccc6.png

    struct demo

      struct somtTemp{
                var someString:String
                init(someString:String) {
                    self.someString = someString
                }
            }
            
            var classB = somtTemp(someString: "123")
            var classC = classB
            print("第一次赋值---\(classB.someString)-------\(classC.someString)")
            
            classC.someString = "43211"
            print("第二次赋值---\(classB.someString)-------\(classC.someString)")
    

    结果:


    Snip20190508_4.png

    图解:


    931525-bb31ef348ed89f85.png

    为什么需要struct?

    struct和class的主要区别,

    * struct是值引用,而class是类型引用
    * struct没有继承的功能,class有继承功能
    

    首先说第一点区别,从swift的更新和struct不断完善来看,苹果公司更加推荐使用struct来代替class,因为struct值引用和class类型引用这点区别,保证使用struct编码能写出更加安全可靠的代码。为什么这样说呢,class类型引用在赋值时是将变量指向了同一块内存地址,这在一个长时间的跨度上会带来一些意想不到的问题,试想一个简单的例子,viewControllerA持有一个NSMutableArray数组mutalbeArray,它包含100条user信息,此时将mutableArray赋值给viewControllerB,对于viewControllerB而言,它仅仅需要前10条user信息,所以它将mutableArray多余的信息删除了,这样一个脑残的操作导致了viewControllerA模块展示错误和潜在的逻辑错误。而使用struct值引用则不会出现这样的问题。

    第二点区别,struct没有继承的功能,这是因为swift在本质上来说是面向协议(Protocol Oriented)的语言,struct没有也不需要继承的功能,为了实现某个功能,struct去服从并实现某个协议就即可,从一个较高的层次来看,struct+protocol是构成swift面向协议语言的两个基石。这一点不在本文讨论范围,不再赘述。
    为什么要使用struct呢?总结就是struct可以保证代码更加安全可靠,以及struct+protocol更加切合swift面向协议编程的初衷。

    相关文章

      网友评论

          本文标题:swift学习记录--- class 与struc

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