Swift5探究:值类型与引用类型

值类型

在 Swift 中,struct、enum、 tuple 都是值类型。而平时使用的 Int, Double,Float,String,Array,Dictionary,Set 其实都是用结构体实现的,所以也是值类型。值类型的赋值为深拷贝(Deep Copy),值语义(Value Semantics)即新对象和源对象是独立的,当改变新对象的属性,源对象不会受到影响。代码如下:

struct Coordinate {
   var x: Double
   var y: Double
}
 //值类型,深拷贝
 var coordA = Coordinate(x: 0, y: 0)
 var coordB = coordA
 coordA.x = 100.0
 print("coordA.x -> \(coordA.x)")
 print("coordB.x -> \(coordB.x)")
  //打印内存地址
withUnsafePointer(to: &coordA) { print("\($0)") }
withUnsafePointer(to: &coordB) { print("\($0)") }
coordA.x -> 100.0
coordB.x -> 0.0
0x00007ffeea5012d0
0x00007ffeea5012c0

引用类型

在 Swift 中,class 和闭包是引用类型。引用类型的赋值是浅拷贝(Shallow Copy),引用语义(Reference Semantics)即新对象和源对象的变量名不同,但其引用(指向的内存空间)是一样的,因此当使用新对象操作其内部数据时,源对象的内部数据也会受到影响。代码如下:

 //class和闭包是引用类型(即所有实例共享一份数据拷贝)
  let catA = Cat()
  let catB = catA
  catA.height = 50.0
  print("dogA.height -> \(catA.height)")
  print("dogB.height -> \(catB.height)")
 //打印内存地址
 print(Unmanaged.passUnretained(catA).toOpaque()) 
 print(Unmanaged.passUnretained(catB).toOpaque())
 dogA.height -> 50.0
 dogB.height -> 50.0
 0x00006000009e7100
 0x00006000009e7100

推荐阅读更多精彩内容

  • 前言 面试之前并不了解阿里体育这个公司,三面的时候根据面试官的介绍,阿里体育是阿里巴巴的投资公司,管理团队和阿里巴...
    一意孤行的程序猿阅读 1,817评论 0 6
  • JS中的函数 一、定义绝对值函数 第一种方式: 第二种方式: 函数相当于是匿名的,可以把结果赋值给abs,通过ab...
    雪国_3472阅读 52评论 0 1
  • 本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...
    龙门逍遥子阅读 17评论 0 0
  • 集合结构 一个集合,就是一个圆圈中有很多个元素,元素与元素之间没有任何关系 这个很简单 线性结构 一个条线上站着很...
    iOS小怪兽阅读 57评论 0 0
  • 目录 常见算法 不用中间变量,用两种方法交换A和B的值 求最大公约数 判断质数 字符串逆序输出 排序相关算法 选择...
    小和大大阅读 217评论 0 0