美文网首页Swift 从入门到放弃
swift5 基本语法-结构体和类

swift5 基本语法-结构体和类

作者: 翀鹰精灵 | 来源:发表于2021-01-04 22:54 被阅读0次

    在swift标准款中,绝大多数的公开类都是【结构体】,比如Bool、Int、Double、String、Array、Dictonary等常见类型在swift中都是结构体。

    1.结构体

    例:

    struct Season {
       var spring : String
       var summer : String
       var autumn : String
       var winter : String
    }
    let season = Season(spring:"春天", summer:"夏天",autumn:"秋天",winter:"冬天");
    print("季节 -- \(season.spring)")
    print("季节 -- \(season.summer)")
    print("季节 -- \(season.autumn)")
    print("季节 -- \(season.winter)")
    
    

    所有的结构体都有一个编译器自动生成的初始化器(initializer,初始化方法,构造器,构造方法)。

    当然我们也可以自定义初始化器,一旦在定义结构体的时自定义了初始化器,编译器就不会再帮它自动生成其它初始化器。

    struct Point {
        var x : Int = 0
        var y : Int = 0
        init(x: Int, y: Int) {
            self.x = x
            self.y = y
        }
    }
    //p0和p1写法相同
    let p0 = Point.init(x: 10, y: 10);
    let p1 = Point(x:10, y:10);
    print("---p1:",p1)
    

    小结:
    结构体中所有成员(存储属性,Stored Property)都有初始值。

    01.png 02.png
    2.类

    类的定义和结构体类似,但编译器并没有为类自动生成可传入成员值的初始化器。

    03.png

    如图所示,传入参数的初始化方法都会报错,但是编译器会为【类】生产一个无参的初始化器。

    但是如果定义的【类】没有初始值,无参的初始化器也会报错。

    04.png

    当然类我们也可以自定义初始化方法,调用自己的初始化方法。

    05.png

    总结: 结构体 VS 类 的区别

    • 结构体是值类型,类是引用类型;
    • 1.1 值类型, 直接将所有内容拷贝一份,属于深拷贝(deep copy)
    • 1.2 引用类型,将内存地址拷贝一份,属于浅拷贝(shallow copy)
    06.png

    通过上图的这两个示例,我们可以发下值类型(结构体) 和 引用类型(类) 是有差别的。

    • ①. 值类型(结构体)
      1.1 如果结构体定义为let常量,结构体是不能够被覆盖的,p1 = StructPoint(x: 20, y: 20)会报错;
      1.2 其次,成员也是不允许修改的,p1.x = 30p1.y = 40也会报错。
    • ②. 引用类型(类)
      如果类定义为let常量,是不允许在赋值其它对象,但可以修改其成员属性。

    相关文章

      网友评论

        本文标题:swift5 基本语法-结构体和类

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