swift之结构体

本文深入探讨Swift中的结构体,包括基本使用、构造方法、自定义构造方法及其与编译器生成构造方法的区别,以及结构体的内存布局特性。

一、结构体

1.1-基本使用

/*
1、在swift标准库中,大多数公开类型都是结构体,而枚举和类只占很小一部分
2、比如bool、int、double、string、array、dictionary等常见类型都是结构体
3、所有结构体都有一个编译器自动生成的构造方法(initalizer,初始化方法、构造器、初始化器)
4、调用时,可以传入所有成员值用以初始化所有成员
*/
struct Date{
    var year:Int
    var month:Int
    var day:Int
}

var date=Date(year:2020,month:5,day:4)
print(date.self)
Date(year: 2020, month: 5, day: 4)

1.2-结构体的构造方法

struct Test{
    var a:Int
    var b:Int
}
var t1 = Test(a:1,b:2)
print(t1)
Test(a: 1, b: 2)
var t2 = Test(a:1)
Missing argument for parameter 'b' in call
var t3 = Test(b:2)
Missing argument for parameter 'a' in call
var t4 = Test()
Missing argument for parameter 'a' in call

struct Test{
    var a:Int = 1
    var b:Int = 2
}
var t1 = Test()
print(t1)
var t2 = Test(a:3)
print(t2)
var t3 = Test(b:4)
print(t3)
var t4 = Test(a:3,b:4)
print(t4)
Test(a: 1, b: 2)
Test(a: 3, b: 2)
Test(a: 1, b: 4)
Test(a: 3, b: 4)

1.3.1-结构体的自定义构造方法

//定义了init,编译器就不会自动生成构造方法
struct Test {
    var a: Int = 0
    var b: Int = 0
    init(a: Int, b: Int){
        self.a=a
        self.b=b
    }
}
t1=Test()
Use of unresolved identifier 't1'
var test=Test(a:1,b:2)
print(test)
Test(a: 1, b: 2)


struct Test {
    var a: Int = 0
    var b: Int = 0
}
//===上下完全等效===
struct Test {
    var a: Int
    var b: Int
    init(){
        a=0
        b=0
    }
}

1.3.2 编译器init和自定义init本质比较

struct Test1 {
    var a: Int = 0
    var b: Int = 0
}

var t1 = Test1()
print(t1)

struct Test2 {
    var a: Int
    var b: Int
    init(){
        a=0
        b=0
    }
}

var t2 = Test2()
print(t2)

->  0x100001502 <+18>:  callq  0x100001810               ; test.Test1.init() -> test.Test1 at main.swift:1
test`Test1.init():
->  0x100001810 <+0>:  pushq  %rbp
    0x100001811 <+1>:  movq   %rsp, %rbp
    0x100001814 <+4>:  xorps  %xmm0, %xmm0
    0x100001817 <+7>:  movaps %xmm0, -0x10(%rbp)
    0x10000181b <+11>: movq   $0x0, -0x10(%rbp)
    0x100001823 <+19>: movq   $0x0, -0x8(%rbp)
    0x10000182b <+27>: xorl   %eax, %eax
    0x10000182d <+29>: movl   %eax, %ecx
    0x10000182f <+31>: movq   %rcx, %rax
    0x100001832 <+34>: movq   %rcx, %rdx
    0x100001835 <+37>: popq   %rbp
    0x100001836 <+38>: retq   
->  0x1000015f3 <+259>: callq  0x100001910               ; test.Test2.init() -> test.Test2 at main.swift:12
test`Test2.init():
->  0x100001910 <+0>:  pushq  %rbp
    0x100001911 <+1>:  movq   %rsp, %rbp
    0x100001914 <+4>:  xorps  %xmm0, %xmm0
    0x100001917 <+7>:  movaps %xmm0, -0x10(%rbp)
    0x10000191b <+11>: movq   $0x0, -0x10(%rbp)
    0x100001923 <+19>: movq   $0x0, -0x8(%rbp)
    0x10000192b <+27>: xorl   %eax, %eax
    0x10000192d <+29>: movl   %eax, %ecx
    0x10000192f <+31>: movq   %rcx, %rax
    0x100001932 <+34>: movq   %rcx, %rdx
    0x100001935 <+37>: popq   %rbp
    0x100001936 <+38>: retq  

1.4结构体的内存结构

struct Test {
    var a: Int
    var b: Int
    var c:Bool
    init(){
        a=0
        b=0
        c=false
    }
}
print(MemoryLayout<Test>.alignment)//对齐8个字节
print(MemoryLayout<Test>.size)//实际占用17字节
print(MemoryLayout<Test>.stride)//结构体占用24字节
8
17
24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值