目录
Swift底层原理探索----属性 & 方法
结构体
- 在Swift标准库中,绝大多数公开类型都是结构体,而枚举和类只占很小的一部分
比如Bool
、Int
、Double
、String
、Array
、Dictionary
等常见类型都是结构体
struct Date {
var year: Int
var month: Int
var day: Int
}
var date = Date(year: 2020, month:02, day:29)//编译器为结构体自动生成的初始化器
- 所有的结构体都有一个编译器自动生成的初始化器(initializer,初始化方法,构造器,构造方法)
在第⑥行调用的,可以传入所有成员值,用以初始化所有成员(存储属性,Stored Property)
结构体的初始化器
编译器会根据情况,可能会为结构体生成多个初始化器,宗旨是:保证所有成员有初始值,保证代码的安全
,看一下如下几种场景,报错的原因都是因为有成员变量没有赋初始化值
下面这样,就没有问题
struct Point {
var x: Int = 0
var y: Int = 0
}
var p1 = Point(x: 10, y: 10)
var p2 = Point(y: 10)
var p3 = Point(x: 10)
var p4 = Point()
再看一个场景
struct Point {
var x: Int?
var y: Int?
}
var p1 = Point(x: 10, y: 10)
var p2 = Point(y: 10)
var p3 = Point(x: 10)
var p4 = Point()
由于var x: Int?
var y: Int?
声明之后,默认有初始值nil
,因此也不会有上述的报错
自定义初始化器
一旦在定义结构体时自定义了初始化器,编译器就不会再帮它自动生成其他初始化器
窥探初始化器的本质
下面是两端等效的代码,第一段使用了系统生成的无参初始化起,第二段使用了我们自定义的无参初始化器
struct Point {
var x: Int = 0
var y: Int = 0
}
var p = Point()
struct Point {
var x: Int
var y: Int
init() {
x = 0
y = 0
}
}
var p = Point()
我们分别来看一下他们的汇编代码
func testStruct() {
struct Point {
var x: Int = 0
var y: Int = 0
}
var p = Point() //在这里加上断点并且运行程序
}
testStruct()
***************汇编代码
SwiftTest`init() in Point #1 in testStruct():
-> 0x1000010b0