Swift小知识点之 结构体
前言
-
在 Swift 标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分
-
比如Bool、Int、Double、 String、Array、Dictionary等常见类型都是结构体
struct Date { var year: Int var month: Int var day: Int } var date = Date(year: 2019, month: 6, day: 23)
-
-
所有的结构体都有一个编译器自动生成的初始化器(initializer,初始化方法、构造器、构造方法)
- 在最后一行调用的,可以传入所有成员值,用以初始化所有成员(存储属性,Stored Property)
结构体的初始化器
- 编译器会根据情况,可能会为结构体生成多个初始化器,宗旨是:保证所有成员都有初始值
struct Point{ var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = Point(y: 20) //报错 Missing argument for parameter 'x' in call var p3 = Point(x: 10) //报错 Missing argument for parameter 'y' in call var p4 = Point() //报错 Missing argument for parameter 'x' in call
如果给定一个初始值
struct Point{ var x: Int = 10 var y: Int } var p1 = Point(x: 10, y: 20) var p2 = Point(y: 20) var p3 = Point(x: 10) //报错 Missing argument for parameter 'y' in call var p4 = Point() //报错 Missing argument for parameter 'y' in call
如果x 和 y都有初始值的话,就怎么都不会报错了,因为 所有成员都有初始值
struct Point{ var x: Int = 10 var y: Int = 20 } var p1 = Point(x: 10, y: 20) var p2 = Point(y: 20) var p3 = Point(x: 10) var p4 = Point()
初始值为nil的话,也可以编译通过,比如下面这种
struct Point{ var x: Int? var y: Int? } var p1 = Point(x: 10, y: 20) var p2 = Point(y: 20) var p3 = Point(x: 10) var p4 = Point()
自定义初始化器
- 一旦在定义结构体时自定义了初始化器,编译器就不会再帮它自动生成其他初始化器
struct Point{ var x: Int = 10 var y: Int = 20 init(x: Int, y: Int) { self.x = x self.y = y } } var p1 = Point(x: 10, y: 20) var p2 = Point(y: 20) //报错 Missing argument for parameter 'x' in call var p3 = Point(x: 10) //报错 Missing argument for parameter 'y' in call var p4 = Point() //报错 Missing argument for parameter 'x' in call
结构体的内存结构
struct Point { var x: Int = 0 var y: Int = 0 var origin: Bool = true } print(MemoryLayout<Point>.size) //17 print(MemoryLayout<Point>.stride) //24 print(MemoryLayout<Point>.alignment) //8
是因为内存对齐的缘故,17是因为 实际使用的是 8+8+1 = 17 24 是因为,要内存对齐,8*3 = 24
浙公网安备 33010602011771号