Swift学习笔记

结构体

2022-02-17  本文已影响0人  aven_kang

[图片上传中...(截屏2022-02-17 上午11.56.11.png-bf3c74-1645070176879-0)]
[图片上传中...(截屏2022-02-17 上午11.59.43.png-d22d32-1645070390476-0)]
[图片上传中...(截屏2022-02-17 下午12.00.45.png-bf842f-1645070450289-0)]
[图片上传中...(截屏2022-02-17 下午12.05.58.png-5b67fd-1645070764001-0)] 截屏2022-02-17 下午12.06.16.png
struct Point {
  var x = 10;
  var y = 20;
  var b = true
}

var p = Point(x:11,y:12,b:false)
p = Point(x:22)

这是struct跟类不同的地方,结构体可以自动初始化器,类是不行的,类在初始化的时候,是不会自动出现x,y,b这些自动补全属性如下图


截屏2022-02-17 下午12.12.12.png
截屏2022-02-17 下午12.13.40.png

结构体和类的本质

区别:OC在结构体内不允许定义方法,Swift是可以的
结构体事值类型(枚举也是值类型),类是引用类型(指针类型)


截屏2022-02-17 下午12.50.07.png

在上图中,结构体在类中初始化了,结构体存放在栈空间,两个Int类型的,共占用32个字节,而类的的初始化也是存放在栈空间,但是,只是存放了指针地址,也是八个字节,但是指针指向了堆空间,真正存放东西的地方。
如果在汇编中没发现alloc,malloc,基本都是存放在栈空间的

结构体存在在哪里,取决于它的位置在哪里,如果在函数里面,那就是在栈空间的,如果是全局的,那就是数据段里,全局的一个位置。如果结构体是类的一个成员,那么就是跟随类存放在对空间

对象的对空间申请过程

截屏2022-02-17 下午1.02.41.png

值类型

截屏2022-02-17 下午1.22.07.png
值类型的赋值操作
截屏2022-02-17 下午1.29.41.png
1.在swift标准库中,为了提升性能,String,Array,Dictonary,set采用了Copy on write技术
2.比如仅当有写操作时,才会真正执行深度拷贝,如果是自定义的结构体,赋值的时候,是直接进行深度拷贝的
3.对于标准库值类型的赋值操作,Swift能确保最佳性能,所以没有必要为了保证最佳性能来避免赋值
4.建议:不需要修改的,尽量定义成let

引用类型

截屏2022-02-17 下午1.38.58.png
func testtt() {
        
        class Szie {
            
            var width: Int
            var height: Int
            init(width: Int,height:Int){
                self.width = width;
                self.height = height;
            }
            
        }
        
        var s1 = Szie(width: 10, height: 11);
        var s2 = s1;
        s2.height = 30;
        print(s1.height);
        print(s1.height);
    }

在上述代码中,s1赋值给了s2,然后s2改了成员变量,却发现s1的也跟着变了,其实在引用类型的赋值中,其实赋值的是指针,都是指向同一块内存地址,所以是相互影响的。

上一篇下一篇

猜你喜欢

热点阅读