在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)
01.png 02.png
小结:
结构体中所有成员(存储属性,Stored Property)都有初始值。
2.类
类的定义和结构体类似,但编译器并没有为类自动生成可传入成员值的初始化器。
03.png如图所示,传入参数的初始化方法都会报错,但是编译器会为【类】生产一个无参的初始化器。
但是如果定义的【类】没有初始值,无参的初始化器也会报错。
04.png当然类我们也可以自定义初始化方法,调用自己的初始化方法。
05.png总结: 结构体 VS 类 的区别
- 结构体是值类型,类是引用类型;
- 1.1 值类型, 直接将所有内容拷贝一份,属于深拷贝(deep copy)
- 1.2 引用类型,将内存地址拷贝一份,属于浅拷贝(shallow copy)。
通过上图的这两个示例,我们可以发下值类型(结构体) 和 引用类型(类) 是有差别的。
- ①. 值类型(结构体)
1.1 如果结构体定义为let常量,结构体是不能够被覆盖的,p1 = StructPoint(x: 20, y: 20)
会报错;
1.2 其次,成员也是不允许修改的,p1.x = 30
和p1.y = 40
也会报错。 - ②. 引用类型(类)
如果类定义为let常量,是不允许在赋值其它对象,但可以修改其成员属性。
网友评论