前言

swift中的结构体和类在组成和功能上具有一定的相似性、两者都可以含有成员属性、成员方法用于数据存储和功能性模块封装。往往造成不知如何对二者进行区分和使用

值类型概念和引用类型概念

值类型的概念:值类型是指在系统进行标准的复制后,被复制的对象与复制出的对象之间完完全全的不存在任何关系,彼此之间具有绝对性的独立、此类型的数据被称为值类型(与OC中的深拷贝相同)

引用类型的概念:引用类型是指在系统进行标准复制后,被复制对象与复制出的对象之间具有底层的共有关系,也就是说两者功用的是同一个底层资源。此类型被称为引用类型

值类型与引用类型的根本区别在于其存储区域的不同

swift中的数据存储分为栈区与堆区,栈区存储值类型,堆区存储自定义类型与值类型数据和代码。这里我们因为OC中的一个例子如下:

造成以上结果的差异主要在于存储变量或者对象的空间区域的不同。Class类首先通过alloc init 方法在堆区域创建一个内存空间存放实例属性和代码。然后在把创建的实例引用赋值给一个变量类型存储在栈区,当通过引用时就通过栈区的引用地址区堆区查找实例对象内容。因此赋值一个引用在底层上是对底层进行修改的。

结构体类是值引用类型,可以存储在栈区或者堆区,当存储在栈区或者堆区时其返回的都是数据内容本身,通过对数据本身的赋值也就是为其底层进行数据赋值,其结果是产生一份独立性的数据

值类型与引用类型的嵌套

值类型嵌套值类型:值类型的嵌套会扩大存储区域,内部值是外部值的一部分会产生一个全新的值类型

struct baseStruct {
var number:Int = 10
var numDes:String = "baseStruct"
}

/*值类型嵌套值类型*/
struct numberStruct {
var base:baseStruct!
var number:Int = 20
}

let num:numberStruct = numberStruct(base: baseStruct(number: 10, numDes: "baseStruct"), number: 20)
print("num.num:\(num.number), num.base.name:\(num.base.number)")

var num1:numberStruct = num
num1.number = 200
num1.base.number = 100
print("num1.num:\(num1.number), num1.base.name:\(num1.base.number)")

print("num.num:\(num.number), num.base.name:\(num.base.number)")

打印结果
num.num:20, num.base.name:10
num1.num:200, num1.base.name:100
num.num:20, num.base.name:10

引用类型嵌套引用类型:引用类型的嵌套可以理解为一个全新的引用类型

class baseClass {
var number:Int = 10
var numDes:String = "baseStruct"
}

struct baseStruct {
var number:Int = 10
var numDes:String = "baseStruct"
}

class Student {
var baseCl:baseClass = baseClass.init()
var baseStru:baseStruct = baseStruct.init()
func printDes() -> Void {
print("baseCL\(self.baseCl.number, self.baseCl.numDes) baseStru:\(self.baseStru.number, self.baseStru.numDes)")
}
}

let stu1:Student = Student.init()
stu1.baseCl.number = 10
stu1.baseCl.numDes = "baseClass"
stu1.baseStru.number = 20
stu1.baseStru.numDes = "baseStruct"
stu1.printDes()

let stu2:Student = stu1
stu2.baseCl.number = 100
stu2.baseCl.numDes = "baseClass*10"
stu2.baseStru.number = 200
stu2.baseStru.numDes = "baseStruct*10"
stu2.printDes()

stu1.printDes()
baseCL(10, "baseClass") baseStru:(20, "baseStruct")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")

引用类型嵌套值类型:引用类型嵌套值类型产生一个全新的引用类型

class baseClass {
var number:Int = 10
var numDes:String = "baseStruct"
}

struct baseStruct {
var number:Int = 10
var numDes:String = "baseStruct"
}

class Student {
var baseCl:baseClass = baseClass.init()
var baseStru:baseStruct = baseStruct.init()
func printDes() -> Void {
print("baseCL\(self.baseCl.number, self.baseCl.numDes) baseStru:\(self.baseStru.number, self.baseStru.numDes)")
}
}

let stu1:Student = Student.init()
stu1.baseCl.number = 10
stu1.baseCl.numDes = "baseClass"
stu1.baseStru.number = 20
stu1.baseStru.numDes = "baseStruct"
stu1.printDes()

let stu2:Student = stu1
stu2.baseCl.number = 100
stu2.baseCl.numDes = "baseClass*10"
stu2.baseStru.number = 200
stu2.baseStru.numDes = "baseStruct*10"
stu2.printDes()

stu1.printDes()
baseCL(10, "baseClass") baseStru:(20, "baseStruct")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")

值类型嵌套引用类型:当值类型嵌套引用类型时情况有些复杂,他产生的对象类型时一个变异的值类型!值类型中的非引用类型会发生全新的拷贝,引用类型则遵循引用类型的拷贝规则。总结起来就是变异的值类型依然会产生一个最新的拷贝副本,但是如果其中有引用属性时则拷贝的引用属性仅仅时拷贝的一个引用指针并不是引用内容

struct baseStruct {
var number:Int = 10
var numDes:String = "baseStruct"
}

class baseClass {
var number:Int = 10
var numDes:String = "baseStruct"
}

/*值类型嵌套值类型*/
struct numberStruct {
var base:baseStruct!
var number:Int = 20
}

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

/*值类型嵌套引用类型*/
var stu1:numberExample = numberExample.init()
stu1.baseCl.number = 10
stu1.baseCl.numDes = "baseClass"
stu1.baseStru.number = 20
stu1.baseStru.numDes = "baseStruct"
stu1.printDes()

var stu2:numberExample = stu1
stu2.baseCl.number = 100
stu2.baseCl.numDes = "baseClass*10"
stu2.baseStru.number = 200
stu2.baseStru.numDes = "baseStruct*10"
stu2.printDes()

stu1.printDes()

}

baseCL(10, "baseClass") baseStru:(20, "baseStruct")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")
baseCL(100, "baseClass*10") baseStru:(20, "baseStruct")

结论:在swift中,无论你何时去拷贝一个值类型,则都会产生一个全新的副本,拷贝一个引用类型则产生一份全新的引用,其底层不发声任何变化

https://blog.csdn.net/die_word/article/details/82110990

Swift - 值类型与引用类型的初步探究的更多相关文章

  1. Swift 值类型和引用类型

    Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组:二,引用类型(reference types),引用类型的实例共享 ...

  2. Swift 值类型/引用类型

    1.值类型/引用类型 在 Swift 语言中,所有的类型都可以被分为 "值类型" 或者 "引用类型",可以将其理解为函数参数传递的方式. 值类型表示的是将它传递 ...

  3. Swift 值类型和引用类型的内存管理

    1.内存分配 1.1 值类型的内存分配 在 Swift 中定长的值类型都是保存在栈上的,操作时不会涉及堆上的内存.变长的值类型(字符串.集合类型是可变长度的值类型)会分配堆内存. 这相当于一个 &qu ...

  4. swift的值类型和引用类型

    前言 最近在学设计模式中,发现 Swift 中的 struct,class 以及 enum 在一般的使用中能够做到互相替换,因此探究其背后的逻辑就十分有必要.而这一问题又引出了 Swift 中的值类型 ...

  5. C#中的DateTime是值类型还是引用类型

    近期遇到了DateTime到底是值类型还是引用类型的疑惑,顺势较深入地了解一下DateTime相关的内容 结论:DateTime是值类型,因为DateTime是结构体,而结构体继承自Syste.Val ...

  6. C# - 值类型、引用类型&走出误区,容易错误的说法

    1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...

  7. 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  8. 图解C#的值类型,引用类型,栈,堆,ref,out

    C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...

  9. c# 我所理解的 值类型 and 引用类型

    一直以来对于值类型和引用类型都只是一个模糊的概念,趁最近有空深入理解了下. 先说说值类型,在msdn上是这样介绍值类型的. 意思就是值类型直接包含值. 变量引用的位置就是值所在内存中实际存储的位置,所 ...

随机推荐

  1. XMU 1617 刘备闯三国之汉中之战 【BFS+染色】

    1617: 刘备闯三国之汉中之战 Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 6  Solved: 5[Submit][Status][Web B ...

  2. ip地址管理与子网划分

    1,高层协议(主机到主机或应用问题)负责名字到地址的映射.国际模块负责网际地址到局域网地址的映射.底层(如本地网或网关)程序的任务是负责本地网地址到路由上的映射. 2,地址是由4个八位字节组成(32位 ...

  3. bleve搜索引擎源码分析之索引——mapping真复杂啊

    接下来看看下面index部分的源码实现: data := struct { Name string Des string }{ Name: "hello world this is bone ...

  4. 并不对劲的DFT

    FFT是一个很多人选择背诵全文的算法. #include<algorithm> #include<cmath> #include<complex> #include ...

  5. JVM垃圾回收面试题

    Java垃圾回收有个经典面试题,什么时候,对什么对象,做了什么操作? 垃圾回收里涉及内容很多,要准确回答这个问题首先要先限定边界.分清楚虚拟机规范定义和不同虚拟机实现的差异.以工作中用到的hotspo ...

  6. ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(四)图书信息的增删改查

    前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...

  7. Codeforces785D - Anton and School - 2

    传送门 题意 给出一个只包含'(',')'的字符序列,询问有多少个\(RSBS\) 分析 首先需要知道一个公式 \[\sum_{i=0}^{min(x,y)}C_x^i*C_y^i=C_{x+y}^x ...

  8. bzoj 3218: a + b Problem【主席树+最小割】

    直接建图比较显然,是(s,i,w),(i,t,b),(i,i',p),(i,j,inf),然而建出来之后发现边数是n方级别的,显然跑不过去,然后就有一种比较神的思路:把a离散了建一棵权值线段树,然后要 ...

  9. Luogu P1991 无线通讯网 【最小生成树】

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  10. 关于Http的小常识(转载,仅供参考)

    HTTP请求头提供了关于请求,响应或者其他的发送实体的信息.HTTP的头信息包括通用头.请求头.响应头和实体头四个部分.每个头域由一个域名,冒号(:)和域值三部分组成. 通用头标:即可用于请求,也可用 ...