struct Point {
var x: Int = 0
var y: Int = 0
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
var p0 = Point(x: 0, y: 10)
var p1 = Point(y: 0)
var p2 = Point(x: 0)
var p3 = Point()
在定义成员值时并赋值了初始值,也自定义初始化器,所以编译器就不会自动生成其他初始化器

看下这两种初始化有何区别?
func testStruct() {
struct Point {
var x: Int = 0
var y: Int = 0
}
var _ = Point()
}
testStruct()
func testStruct() {
struct Point {
var x: Int
var y: Int
init() {
x = 0
y = 0
}
}
var _ = Point()
}
testStruct()
通过汇编来查看是否有区别,两个一模一样,都是下面
TestSwift`init() in Point #1 in testStruct(): -> 0x100001940 <+0>: pushq %rbp 0x100001941 <+1>: movq %rsp, %rbp 0x100001944 <+4>: xorps %xmm0, %xmm0 0x100001947 <+7>: movaps %xmm0, -0x10(%rbp) 0x10000194b <+11>: movq $0x0, -0x10(%rbp) 0x100001953 <+19>: movq $0x0, -0x8(%rbp) 0x10000195b <+27>: xorl %eax, %eax 0x10000195d <+29>: movl %eax, %ecx 0x10000195f <+31>: movq %rcx, %rax 0x100001962 <+34>: movq %rcx, %rdx 0x100001965 <+37>: popq %rbp 0x100001966 <+38>: retq
内存结构
看一下下面一个结构体的内存结构

根据内存地址查看

从上面的存储可看到,三个属性的存储地址是相邻的!!!
也可以通过封装的Mems内存类来直接查询

2、类
类的定义和结构体类似, 但是编译器并没有为类自动生成可以传入成员值的初始化器

上面class定义,知编译器不会自动生成可以传入成员值的初始化器,因为定义的x,y都具有初始化值,xcode还会自动的生成无参的初始化值,如果x,y没有初始化值,连无参的初始化器都不会调用成功!
上面如果改成struct修饰,就不会有任何的错误
结论:
如果类的所有成员都在定义的时候制定了初始值,编译器会为类生成无参的初始化器
区别
1. 结构体是值类型(枚举也是值类型), 类是引用类型(指针类型)
class Size {
var width = 1
var height = 2
}
struct Point {
var x = 3
var y = 4
}
func test() {
var size = Size()
var point = Point()
}
对于上面的代码,point为值类型,如果值类型在函数里面定义,就放在栈空间,point里面有x,y共有16个字节,假设起始地址为0x10000,而Size对象是引用类型,size指针变量存放在栈空间中,存放的是地址(指针类型占用8个字节),地址指向的为堆空间,堆空间的大小为32个字节,内存结构大致如








