- 在Swift标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分
- 比如Bool,Int,Double,String,Array,Dictionary等常见类型都是结构体
//自定义一个简单的结构体
struct Date {
var year: Int
var month: Int
var day: Int
}
var d1 = Date(year: 2020, month: 9, day: 8)
结构体的初始化器
- 所有的结构体都有一个编译器自动生成的初始化器(initializer,初始化方法,构造器,构造方法)
- 编译器会根据情况,可能会为结构体生成多个初始化器,宗旨是:保证所有成员都有初始值
//像下边的情况,x有一个默认值,这样编译器会生成两个初始化器,一个是p1的,一个是p2的
struct Point {
var x: Int = 1
var y: Int
}
var p1 = Point(y: 2)
var p2 = Point(x: 1, y: 2)
//四种情况都可以初始化Point
struct Point {
var x: Int = 1
var y: Int = 2
}
var p1 = Point(x: 1)
var p2 = Point(y: 2)
var p3 = Point()
var p4 = Point(x: 1, y: 2)
//在这里,可选项都有个默认值nil,相当于x和y都有初始值nil,所以下边四个初始化器都可以使用
struct Point {
var x: Int?
var y: Int?
}
var p1 = Point(x: 1)
var p2 = Point(y: 2)
var p3 = Point()
var p4 = Point(x: 1, y: 2)
自定义初始化器
- 一旦在定义结构体的时候自定义了初始化器,编译器就不会再帮它自动生成其他初始化器
- 看一下下边这种情况,自定义了初始化器后,默认的其他几个初始化器就不能使用了
struct Point {
var x: Int = 0
var y: Int = 0
init(x:Int,y:Int) {
self.x = x
self.y = y
}
}
var p1 = Point(x: 1)//报错
var p2 = Point(y: 2)//报错
var p3 = Point()//报错
var p4 = Point(x: 1, y: 2)
结构体的内存结构
struct Point {
var x: Int = 0
var y: Int = 0
}
print(MemoryLayout<Point>.size)
print(MemoryLayout<Point>.stride)
print(MemoryLayout<Point>.alignment)
struct Point {
var x: Int = 0
var y: Int = 0
var b = false
}
print(MemoryLayout<Point>.size)//17,Int是8个字节,Bool是1个字节,所以这里是17
print(MemoryLayout<Point>.stride)//24
print(MemoryLayout<Point>.alignment)//8