swift之类与值类型引用类型区别

14 篇文章 0 订阅

一、类

1.1-基本使用

class Test{
    var a:Int
    var b:Int
}
//编译失败,Class 'Test' has no initializers
class Test{
    var a:Int=0
    var b:Int=0
}

let t1 = Test()
//不报错
let t2=Test(a:1,b:2)
//Argument passed to call that takes no arguments

/*
类的定义和结构体类似,但编译器没有为类自动生成可以传入成员值的构造函数
*/

1.2-类的构造函数

/*
1、如果类的成员都在定义的时候指定初始值编译器会为类生成无参的构造函数
2、成员的初始化是在这个构造函数中完成
*/
class Test2{
    var a:Int=1
    var b:Int=2
}

class Test2{
    var a:Int
    var b:Int
    init(){
        a=1
        b=2
    }
}
let t1 = Test1()
let t2 = Test2()
print(t1.a)
print(t2.a)
1
1

class Test{
    var a:Int
    var b:Int
    init(a:Int,b:Int){
        self.a=a
        self.b=b
    }
}

let t1 = Test(a:1,b:2)
print(t1.a)
print(t1.b)
1
2

/*
严格来说,初始化方法不需要返回值,初始化方法是为了让初始化对象能够完全地、正确无误地完成初始化。所以即使你返回了一个nil来触发失败,这并不表明初始化成功了。

*/
init?(参数名 :参数类型) {
    if(条件) {return nil}
    //条件通过执行下面的代码,即表示可继续初始化
    //code...
}

1.3-结构体和类的区别

class Test1{
    var a = 1
    var b = 2
}
/*
结构体是值类型、类是引用类型即指针类型

*/
//类向堆空间申请
    0x1000010db <+43>:  callq  0x100001810               ; test.Test1.__allocating_init() -> test.Test1 at main.swift:1
    0x1000010e0 <+48>:  movq   0xf19(%rip), %rcx         ; (void *)0x00007fff8d9029d8: type metadata for Any
    0x1000010e7 <+55>:  addq   $0x8, %rcx
    0x1000010ee <+62>:  movq   %rax, 0x2113(%rip)

struct Test2 {
    var a = 3
    var b = 4
}

        ; test.t1 : test.Test1

//结构体是值类型,直接是字面量的拷贝
test`Test2.init():
->  0x100000b60 <+0>:  pushq  %rbp
    0x100000b61 <+1>:  movq   %rsp, %rbp
    0x100000b64 <+4>:  xorps  %xmm0, %xmm0
    0x100000b67 <+7>:  movaps %xmm0, -0x10(%rbp)
    0x100000b6b <+11>: movq   $0x3, -0x10(%rbp)
    0x100000b73 <+19>: movq   $0x4, -0x8(%rbp)
    0x100000b7b <+27>: movl   $0x3, %eax
    0x100000b80 <+32>: movl   $0x4, %edx
    0x100000b85 <+37>: popq   %rbp
    0x100000b86 <+38>: retq  

二、值类型、引用类型

2.1-值类型

/*
1、值类型赋值给var、let或者给函数传参,直接将所有内容拷贝一份
2、类似文件的复制粘贴,deep copy
3、在swift标准库中,string、array、dictionary、set采取了copy on write的技术,只有在写操作才会进行拷贝操作
4、建议不需要修改的定义成为常量let
*/
struct Test2 {
    var a = Int
    var b = Int
}

t1 = Test2(a:3,b:4)
t2 = t1

在这里插入图片描述

var t1 = "Test"
var t2 = t1
t2.append("_1")
print(t1)
Test
print(t2)
Test_1

var t1=[1,2,3]
var t2=t1
t2.append(4)
t1[0]=5
print(t1)
[5, 2, 3]
print(t2)
[1, 2, 3, 4]

var t1=["a":1,"b":2]
var t2=t1
t1["c"]=3
t2["d"]=4
print(t1)
["b": 2, "c": 3, "a": 1]
print(t2)
["b": 2, "d": 4, "a": 1]

2.2-引用类型

/*
1、引用赋值给var、let或者给函数传参,是将内存地址拷贝一份,存的是内存地址
2、类似于制作文件快捷方式(替身),指向同一个文件,属于浅拷贝
*/
class Test{
    var a:Int
    var b:Int
    init(a:Int,b:Int){
        self.a=a
        self.b=b
    }
}
var t1=Test(a:1,b:2)
var t2=t1
t2.a=3
t2.b=4
print(t1.a,t2.a)
print(t1.b,t2.b)
3 3
4 4

在这里插入图片描述

2.3-嵌套类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值