swift5 基本语法-结构体和类

在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 基本语法-结构体和类)